# formatDate

## Purpose

Allows the formatting of `java.util.Date` instances using the same patterns defined by the SimpleDateFormat class.

## Examples

    <g:formatDate format="yyyy-MM-dd" date="${date}"/>

    <g:formatDate date="${date}" type="datetime" style="MEDIUM"/>

    <g:formatDate date="${date}" type="datetime" style="LONG" timeStyle="SHORT"/>

    <g:formatDate date="${date}" type="time" style="SHORT"/>

## Description

Attributes

- `date` (required) - The date object to format
- `format` (optional) - The formatting pattern to use for the date, see SimpleDateFormat
- `formatName` (optional) - Look up `format` from the default MessageSource / ResourceBundle (i18n/*.properties file) with this key. If `format` and `formatName` are empty, `format` is looked up with '`default.date.format`' key. If the key is missing, 'yyyy-MM-dd HH:mm:ss z' formatting pattern is used.
- `type` (optional) - The type of format to use for the date / time. `format` or `formatName` aren't used when `type` is specified. Possible values: 'date' - shows only date part, 'time' - shows only time part, 'both'/'datetime' - shows date and time
- `timeZone` (optional) - Sets the time zone for formatting. See TimeZone class.
- `locale` (optional) - Force the locale for formatting.
- `style` (optional) - Use default date/time formatting of the country specified by the locale. Possible values: SHORT (default), MEDIUM, LONG, FULL . See DateFormat for explanation.
- `dateStyle` (optional) - Set separate `style` for the date part.
- `timeStyle` (optional) - Set separate `style` for the time part.

## Source

Show Source

    def formatDate = { attrs ->    	def date
        	if (attrs.containsKey('date')) {
            	date = attrs.get('date')
            	if(date == null) return null
        	}
        	else {
                date = new Date()
        	}    	def locale = resolveLocale(attrs.get('locale'))
        	def timeStyle = null
        	def dateStyle = null
        	if(attrs.get('style') != null) {
        		def style=attrs.get('style').toString().toUpperCase()
        		timeStyle = style
        		dateStyle = style
        	}
        	if(attrs.get('dateStyle') != null) {
        		dateStyle=attrs.get('dateStyle').toString().toUpperCase()
        	}
        	if(attrs.get('timeStyle') != null) {
        		timeStyle=attrs.get('timeStyle').toString().toUpperCase()
        	}
        	def type = attrs.get('type')?.toString()?.toUpperCase()
            def formatName = attrs.get('formatName')
            def format = attrs.get('format')
            def timeZone = attrs.get('timeZone')
            if(timeZone!=null) {
            	if(!(timeZone instanceof TimeZone)) {
            		timeZone = TimeZone.getTimeZone(timeZone as String)
            	}
            } else {
            	timeZone = TimeZone.getDefault()
            }        def dateFormat
            if(!type) {
    	        if(!format && formatName) {
    	            format = messageHelper(formatName,null,null,locale)
    	            if(!format) throwTagError("Attribute [formatName] of Tag [formatDate] specifies a format key [$formatName] that does not exist within a message bundle!")
    	        }
    	        else if (!format) {
    	            format = messageHelper('date.format', { messageHelper('default.date.format', 'yyyy-MM-dd HH:mm:ss z', null, locale) }, null, locale)
    	        }
    	        dateFormat = FastDateFormat.getInstance(format, timeZone, locale)
            } else {
            	if(type=='DATE') {
        	        dateFormat = FastDateFormat.getDateInstance(parseStyle(dateStyle), timeZone, locale)
            	} else if (type=='TIME') {
            		dateFormat = FastDateFormat.getTimeInstance(parseStyle(timeStyle), timeZone, locale)
            	} else { // 'both' or 'datetime'
            		dateFormat = FastDateFormat.getDateTimeInstance(parseStyle(dateStyle), parseStyle(timeStyle), timeZone, locale)
            	}
            }        return dateFormat.format(date)
        }     def parseStyle(styleStr) {
          	def style=FastDateFormat.SHORT
        	if(styleStr=='FULL') {
        		style=FastDateFormat.FULL
        	} else if (styleStr=='LONG') {
        		style=FastDateFormat.LONG
        	} else if (styleStr=='MEDIUM') {
        		style=FastDateFormat.MEDIUM
        	}
          	return style
         }