Internationalization Topics

Time and Date Functions

General Advice

In general, you should store dates and times using ISO 8601 format and the UTC time zone.
You should display dates and times using the user's locale, usually in the user's time zone.

Dates

Different locales represent dates differently. For example, in the United States, a valid date may be 12/6/2002, which is represented in England as 6/12/2002. Additionally, days of the week have different spellings in non-US locales, e.g. Friday corresponds with Freitag in German. As a rule of thumb, dates should be stored in a neutral and consistent manner throughout the application. Locale-specific date formatting should be applied as late in the UI construction process as possible.

C Example

The following example illustrates how to format a short date for the fr_FR locale.

/* Parse a date with short French date/time formatter */
UDateFormat* df = udat_open(UDAT_SHORT, UDAT_SHORT, "fr_FR", "GMT", &status);
UErrorCode status = U_ZERO_ERROR;
int32_t parsepos=0;
UDate myDate = udat_parse(df, myString, u_strlen(myString), &parsepos, &status);

Times

Times also vary by locale. For example, in the United States, a valid time may be 2:45 PM, which corresponds with 14:45 in Germany. As a rule of thumb, times should be stored in a neutral and consistent manner throughout the application. Locale-specific time formatting should be applied as late in the UI construction process as possible. Where possible, a time-zone code or offset should be retained as well.

Time Formatting in ICU

A general discussion of ICU's locale-specific time formatting can be found at ICU Time Formatting. ICU also provides support for dealing with multiple time zones at ICU Time Zones.

Time Formatting in Java

The java.text.TimeZone class is used in conjunction with the DateFormat class to tell how the time zone should be interpreted.

Calendar

International calendar issues include:

  • The type of calendar, e.g. Gregorian, Julian, Hijri, lunar. For business applications it is acceptable to use the Gregorian calendar.
  • The first day of the week, e.g. Sunday is the first day of the week in the USA, but Monday is the first day of the week in most European countries.
  • Workdays and working hours are not supported by any package and must be determined by someone familiar with local customs. For example, workdays in the US differ for different industries.

Java and the IBM ICU package contain calendar class support for the Gregorian calendar. Constructors are available for instantiating calendar objects that are time zone and locale specific:

Calendar(TimeZone zone, Locale aLocale)

Visual C++ Example

In Visual C++ time formatting is accomplished by the setlocale() function:

wchar_t fr_FR L'French_France';

_wsetlocale(LC_ALL,fr_FR);
_wsetlocale(LC_TIME,fr_FR);

This code will set the locale to fr_FR. The first call to _wsetlocale() sets all locale information to fr_FR, while the second sets only the time locale information to fr_FR. Subsequent calls to wcsftime will return locale-sensitive time information. Subsequent calls to wprintf() will display date and time information in a manner appropriate to setlocale information.

Java, C and C++

Java, the IBM ICU package, Visual C++, SQL Server 2000, Oracle 8Ii, and IIS support locale-sensitive date and time displays. The Java locale example provides more information.

Database Support for Date/Time

Databases support date and time displays in many international formats.

Click here for information on SQL date and time formatting.
Click here for information on Oracle date and time formatting.

As mentioned previously, it is advisable to format dates and times in the GUI.