Formatting java.util.Date client-side

603 views
Skip to first unread message

kyruru

unread,
Jul 24, 2006, 5:43:19 PM7/24/06
to Google Web Toolkit
Last I heard, GWT's emulation library does not support some of the
goodies in java.text such as SimpleDateFormat. How have you all been
dealing with formatting Dates client side?

Jason Essington

unread,
Jul 24, 2006, 5:59:12 PM7/24/06
to Google-We...@googlegroups.com
mostly I cheat ...
(date.getMonth() + 1) + "/" + date.getDay() + "/" + (date.getYear()
+ 1900)

If you need full on DateFormat functionality, I suppose you could
extend the class support library ... have a look at the
com.google.gwt.emul package.

Or probably the easiest (but by far the slowest solution would be to
write an RPC that calls back to a service that formats the date on
the server.

-jason

Fred Drake

unread,
Jul 24, 2006, 7:50:22 PM7/24/06
to Google-We...@googlegroups.com
Yep, I just use plain jane java.util.Date and it's getters and setters, and just live with the yellow underline deprecation warnings in Eclipse :-)

-Fred
--
Fred Drake

"All my friends became Cardinal fans and grew up happy and liberal. I became a Cub fan and grew up imbittered and conservative." -- George Will

ejkrause

unread,
Jul 25, 2006, 2:58:34 PM7/25/06
to Google Web Toolkit
Same here... the only other addition I made was:
final static String[] dayNames = {"Sun", "Mon", "Tue", "Wed", "Thu",
"Fri", "Sat"};

Then use dayNames[date.getDay()] to get the weekday name. I probably
mistyped something here, but that's the general idea. Originally I
tried parsing the result of Date.toString, but on FireFox the results
come back differently from IE, so this was easier.

IamRobe...@gmail.com

unread,
Jul 25, 2006, 8:27:34 PM7/25/06
to Google Web Toolkit
Jason Essington wrote:
> mostly I cheat ...
> (date.getMonth() + 1) + "/" + date.getDay() + "/" + (date.getYear()
> + 1900)

Would it be worth while to build a format tool for this? I don't know
that we would want a full blown implementation, that might be a little
too big, but maybe the usual formats.

Rob

Fred Drake

unread,
Jul 25, 2006, 11:45:44 PM7/25/06
to Google-We...@googlegroups.com
If one were written, i'd definitely use it.  Even it emulated just "new SimpleDateFormat(String pattern)", "SimpleDateFormat.format(Date date)" and nothing else, it would probably be a big help.

-Fred


Jason Essington wrote:
> mostly I cheat ...
>  (date.getMonth () + 1) + "/" + date.getDay() + "/" + (date.getYear()

> + 1900)

Would it be worth while to build a format tool for this?  I don't know
that we would want a full blown implementation, that might be a little
too big, but maybe the usual formats.

Rob




Jason Essington

unread,
Jul 26, 2006, 5:06:25 PM7/26/06
to Google-We...@googlegroups.com
On Jul 25, 2006, at 9:45 PM, Fred Drake wrote:
> If one were written, i'd definitely use it. Even it emulated just
> "new SimpleDateFormat(String pattern)", "SimpleDateFormat.format
> (Date date)" and nothing else, it would probably be a big help.
>
> -Fred
>

O.K. then, here ya go :-)

<code>

import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
* <dl>
* <dt><b>Title: </b><dd>SimpleDateFormat</dd>
* <p>
* <dt><b>Description: </b><dd>GWT does not implement any of the
java.text package, so this class tries to fill the void
* of the missing java.text.SimpleDateFormat class. This version
however only supports a subset of the date and time patterns
* supported by its java.text counterpart. The pattern symbols
supported by this class are:
* <dl>
* <dt><b>E</b></dt><dd>Day in a week</dd>
* <dt><b>d</b></dt><dd>Day of the month</dd>
* <dt><b>y</b></dt><dd>Year</dd>
* <dt><b>M</b></dt><dd>Month January, Jan, 01, 1</dd>
* <dt><b>H</b></dt><dd>Hour in 24 hour format (0-23)</dd>
* <dt><b>h</b></dt><dd>Hour in 12 hour format (1-12)</dd>
* <dt><b>m</b></dt><dd>Minute of the hour </dd>
* <dt><b>s</b></dt><dd>Seconds of the minute</dd>
* <dt><b>a</b></dt><dd>am/pm</dd>
* </dl>
* All characters that are not recognised as a date format character
are translated literally into the output string. <br/>
* </dd>
* <p>
* </dl>
* @author <a href="mailto:jas...@greenrivercomputing.com">Jason
Essington</a>
* @version $Revision: 0.0 $
*/

public class SimpleDateFormat
{
private static final String TOKEN_DAY_OF_WEEK = "E";
private static final String TOKEN_DAY_OF_MONTH = "d";
private static final String TOKEN_MONTH = "M";
private static final String TOKEN_YEAR = "y";
private static final String TOKEN_HOUR_12 = "h";
private static final String TOKEN_HOUR_24 = "H";
private static final String TOKEN_MINUTE = "m";
private static final String TOKEN_SECOND = "s";
private static final String TOKEN_AM_PM = "a";

private static final String AM = "AM";
private static final String PM = "PM";

private static final List SUPPORTED_DF_TOKENS = Arrays.asList(new
String[] { TOKEN_DAY_OF_WEEK, TOKEN_DAY_OF_MONTH,
TOKEN_MONTH, TOKEN_YEAR, TOKEN_HOUR_12, TOKEN_HOUR_24,
TOKEN_MINUTE, TOKEN_SECOND, TOKEN_AM_PM });

private static final String[] MONTH_LONG = { "January",
"February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December" };

private static final String[] MONTH_SHORT = { "Jan", "Feb",
"Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct",
"Nov", "Dec" };

private static final String[] WEEKDAY_LONG = { "Sunday",
"Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
"Saturday" };

private static final String[] WEEKDAY_SHORT = { "Sun", "Mon",

"Tue", "Wed", "Thu", "Fri", "Sat" };


private String format;

public SimpleDateFormat(String pattern)
{
format = pattern;
}

public String format(Date date)
{
String f = "";
if (format != null && format.length() > 0)
{
String lastTokenType = null;
String currentToken = "";
for (int i = 0; i < format.length(); i++)
{
String thisChar = format.substring(i, i + 1);
String currentTokenType = SUPPORTED_DF_TOKENS.contains
(thisChar) ? thisChar : "";

if (currentTokenType.equals(lastTokenType) || i == 0)
{
currentToken += thisChar;
lastTokenType = currentTokenType;
}
else
{
if ("".equals(lastTokenType))
f += currentToken;
else
f += handleToken(currentToken, date);

currentToken = thisChar;
lastTokenType = currentTokenType;
}
}
if ("".equals(lastTokenType))
f += currentToken;
else
f += handleToken(currentToken, date);
}

Window.alert(f + "\n" + date.toString() + "\n" +
date.toLocaleString() + "\n" + date.toGMTString());

return f;
}

/**
* takes a date format string and returns the formatted portion
of the date. For instance if the token is MMMM then
* the full month name is returned.
* @param token date format token
* @param date date to format
* @return formatted portion of the date
*/
private String handleToken(String token, Date date)
{
String response = token;
String tc = token.substring(0, 1);
if (SUPPORTED_DF_TOKENS.contains(tc))
{
if (TOKEN_DAY_OF_WEEK.equals(tc))
{
if (token.length() > 3)
response = WEEKDAY_LONG[date.getDay()];
else
response = WEEKDAY_SHORT[date.getDay()];
}
else if (TOKEN_DAY_OF_MONTH.equals(tc))
{
if (token.length() == 1)
response = Integer.toString(date.getDate());
else
response = twoCharDateField(date.getDate());
}
else if (TOKEN_MONTH.equals(tc))
{
switch (token.length())
{
case 1:
response = Integer.toString(date.getMonth());
break;
case 2:
response = twoCharDateField(date.getMonth());
break;
case 3:
response = MONTH_SHORT[date.getMonth()];
break;
default:
response = MONTH_LONG[date.getMonth()];
break;
}
}
else if (TOKEN_YEAR.equals(tc))
{
if (token.length() > 2)
response = Integer.toString(date.getYear() + 1900);
else
response = twoCharDateField(date.getYear());
}
else if (TOKEN_HOUR_12.equals(tc))
{
int h = date.getHours();
if (h == 0)
h = 12;
else if (h > 12) h -= 12;

if (token.length() > 1)
response = twoCharDateField(h);
else
response = Integer.toString(h);
}
else if (TOKEN_HOUR_24.equals(tc))
{
if (token.length() > 1)
response = twoCharDateField(date.getHours());
else
response = Integer.toString(date.getHours());
}
else if (TOKEN_MINUTE.equals(tc))
{
if (token.length() > 1)
response = twoCharDateField(date.getMinutes());
else
response = Integer.toString(date.getMinutes());
}
else if (TOKEN_SECOND.equals(tc))
{
if (token.length() > 1)
response = twoCharDateField(date.getSeconds());
else
response = Integer.toString(date.getSeconds());
}
else if (TOKEN_AM_PM.equals(tc))
{
int hour = date.getHours();
if (hour > 11)
response = PM;
else
response = AM;
}
}

return response;

}


/**
* This is basically just a sneaky way to guarantee that our 1 or
2 digit numbers come out as a 2 character string.
* we add an arbitrary number larger than 100, convert this new
number to a string, then take the right most 2 characters.
* @param num
* @return
*/
private String twoCharDateField(int num)
{
String res = Integer.toString(num + 1900);
res = res.substring(res.length() - 2);
return res;
}
}

</code>

-jason

Essington

unread,
Jul 26, 2006, 5:52:56 PM7/26/06
to Google Web Toolkit
oops, that version has a really annoying Window.alert, and an
extraneous if statement.
try this one:

private String format;

SUPPORTED_DF_TOKENS.contains(thisChar) ? thisChar : "";

if (currentTokenType.equals(lastTokenType) || i == 0)
{
currentToken += thisChar;
lastTokenType = currentTokenType;
}
else
{
if ("".equals(lastTokenType))
f += currentToken;
else
f += handleToken(currentToken, date);

currentToken = thisChar;
lastTokenType = currentTokenType;
}
}
if ("".equals(lastTokenType))
f += currentToken;
else
f += handleToken(currentToken, date);
}

return f;
}

/**
* takes a date format string and returns the formatted portion of
the date. For instance if the token is MMMM then
* the full month name is returned.
* @param token date format token
* @param date date to format
* @return formatted portion of the date
*/
private String handleToken(String token, Date date)
{
String response = token;
String tc = token.substring(0, 1);

return response;

}


I really should learn to proofread my code before posting it :-/

-jason

treeder

unread,
Aug 3, 2006, 2:19:07 AM8/3/06
to Google Web Toolkit
Thanks Jason! That works perfect!

Reply all
Reply to author
Forward
0 new messages