# 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.date
                if (date == null) return
            }
            else {
                date = new Date()
            }        def locale = resolveLocale(attrs.locale)
            String timeStyle = null
            String dateStyle = null
            if (attrs.style != null) {
                String style = attrs.style.toString().toUpperCase()
                timeStyle = style
                dateStyle = style
            }        if (attrs.dateStyle != null) {
                dateStyle = attrs.dateStyle.toString().toUpperCase()
            }
            if (attrs.timeStyle != null) {
                timeStyle = attrs.timeStyle.toString().toUpperCase()
            }
            String type = attrs.type?.toString()?.toUpperCase()
            def formatName = attrs.formatName
            def format = attrs.format
            def timeZone = attrs.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) {
            switch (styleStr) {
                case 'FULL':   return FastDateFormat.FULL
                case 'LONG':   return FastDateFormat.LONG
                case 'MEDIUM': return FastDateFormat.MEDIUM
                default:       return FastDateFormat.SHORT
            }
        }