You are not logged in Log in Join
You are here: Home » Members » AlexR » Custom and international time and date formats

Log in
Name

Password

 

Custom and international time and date formats

Version 0.2

This howto explains how to create custom and international formats to insert time and date values in Zope. I gathered this information from the [email protected] mailing list. Feel free to get in touch about this document.

Version history

  • 23rd October 1999 - version 0.1 - First draft
  • 26th October 1999 - version 0.2 - Added references to the ZQRG

Simple timestamps

To enter the edit time for an objet, use:

<dtml-var bobobase_modification_time>

To enter the current time in Zope, use:

<dtml-var ZopeTime>

In both cases the result is a long timestamp in GMT format. Example:

1999/10/22 13:01:33.059 GMT+1

C-style format strings

If you want another format, you can use C-style format strings. Example:

<dtml-var bobobase_modification_time fmt="%d/%m/%Y - %H:%M">

You get the following results:

22/10/1999 - 11:01

Here is a table of useful C-style time and date formats. I copied it from a Linux reference document (I can't remember which one) for the C strftime function. Note that the output is GMT-based. So you cannot use these codes directly to format date and time values for say European timezones.


%a   An abbreviation for the day of the week. 
%A   The full name for the day of the week. 
%b   An abbreviation for the month name. 
%B   The full name of the month. 
%c   A string representing the complete date and time; on my 
     computer it's in the form: 10/22/99 19:03:23 
%d   The day of the month, formatted with two digits. 
%H   The hour (on a 24-hour clock), formatted with two digits. 
%I   The hour (on a 12-hour clock), formatted with two digits. 
%j   The count of days in the year, formatted with three digits 
     (from 001 to 366). 
%m   The month number, formatted with two digits. 
%M   The minute, formatted with two digits. 
%p   Either AM or PM as appropriate. 
%S   The second, formatted with two digits. 
%U   The week number, formatted with two digits (from 00 to 53; 
     week number 1 is taken as beginning with the first Sunday
     in a year). See also %W. 
%w   A single digit representing the day of the week: 
     Sunday is day 0.
%W   Another version of the week number: like %U, but 
     counting week 1 as beginning with the first Monday in a year. 
%x   A string representing the complete date; on my computer 
     it's in the format 10/22/99.
%X   A string representing the full time of day (hours, minutes, 
     and seconds), in a format like the following example: 13:13:13
%y   The last two digits of the year. 
%Y   The full year, formatted with four digits to include 
     the century. 
%Z   Defined by ANSI C as eliciting the time zone, if available; 
     it is not available in this implementation (which accepts %Z 
     but generates no output for it).
%%   A single character, %.

Note you can also use the following syntax:

<dtml-var "bobobase_modification_time().strftime('%d/%m/%Y - %H:%M')">

For more information about these formats, see the Zope Quick Reference Guide (section about the var tag).

The toZone method

The toZone('myTimeZone') method can be used to convert time/date values to a specific timezone. myTimeZone is a string that holds the name of the timezone. Example:

<dtml-var "bobobase_modification_time().toZone('US/Indiana-Starke')">

The output is:

1999/10/22 12:35:32.481 US/Indiana-Starke

The timezone names are defined in the Zope_dir\lib\python\DateTime\DateTimeZone.py file. I couldn't find one for most European timezones (Zope 2.0.1). Chris Allen has provided files to support Australian timezone names.

You can also add the C-formats mentioned above. Example:

<dtml-var "bobobase_modification_time(). toZone('US/Indiana-Starke').strftime('%d/%m/ %Y - %H:%M')">

Or

<dtml-var "bobobase_modification_time(). toZone('US/Indiana-Starke')" fmt="%d/%m/%Y - %H:%M">

Correcting a date or time value

You can add a value to a date to create a later date. You can also substract a value to create a sooner date. Example:

<dtml-var "ZopeTime() + 2">

The result date is 2 days from now, i.e. "1999/10/24 12:12:14.932 GMT+1" at the time of writing.

Metropolitan French time is GMT + 2 hours during summer time. 2 hours are 0.0833 day. So I guess I could use the following code to get a correct French date format:

<dtml-var "bobobase_modification_time() + 0.0833" fmt="%d/%m/%Y - %H:%M">

This works. However, it is quite ugly and it will break when we change to winter time. I'd need to store the correction value in a global variable.

Build-in functions

Martijn Pieters provided a better solution because AFAIK it doesn't need to be updated for winter time:

<dtml-with bobobase_modification_time>
  <dtml-var "'%s/%s/%i - %s' % (dd(), mm(), year(), 
  TimeMinutes())">
</dtml-with>

The output is:

22/10/1999 - 20:31

This is a Python expression. The 1st, 2nd and 4th functions return a string value. That's why we use the %s placeholder in the format. The 3rd function returns an integer. Hence the %i placeholder.

To customize this example for your own purpose you may need to modify or add placeholders. Example:

<dtml-with bobobase_modification_time>
  <dtml-var "'This is %s, %s/%s/%i, %s' % (Day(), mm(), dd(), 
  year(), TimeMinutes())">
</dtml-with>

The output is:

This is Friday, 10/22/1999, 20:44

For more information about the dd(), mm(), year(), TimeMinutes() and similar functions, see the Zope_dir\lib\python\DateTime\DateTime.html document in your Zope directory. See also the Zope Quick Reference Guide (DateTime section)

The complete expression is a bit complex. You could store it in a DTML method at the root of your Zope server and call it from documents in subdirectories. Example:

<dtml-var myDateTime>
The output is:
22/10/1999 - 20:50

I guess you could also write a small Python external method to easily store custom date formats. I haven't tried that yet. If you have code examples to offer feel free to send them over for inclusion in this document.