NAME

MooseX::Timestamp - simple timestamp type for Moose, with Time Zone

SYNOPSIS

use MooseX::TimestampTZ qw(:all);

print zone 0;       # +0000
print zone 0, 1;    # Z
print zone 12*3600; # +1200

print offset_s "Z";     # 0
print offset_s "+1200"; # 43200   (= 12 * 3600)

# local times
print timestamptz;   # 2007-12-06 23:23:22+1300
print timestamptz 0; # 1970-01-01 12:00:00+1200

# UTC times
print gmtimestamptz;     # 2007-12-06 10:23:22+0000
print gmtimestamptz 0;   # 1970-01-01 00:00:00+0000

# hires timestamps
print tmtimestamptz 0.123;  # 1970-01-01 00:00:00.123+0000

use MooseX::TimestampTZ ":all" => { hires => 1 };
print tmtimestamptz;     #  2010-07-20 14:13:23.73418+1200

# conversion the other way
print epoch "1970-01-01 00:00:00+0000"; # 0
print epoch "1970-01-01 12:00:00+1200"; # 0

print for epochtz "1970-01-01 12:00:00+1200"; # 0, 43200

# you can get these ISO forms if you want, too.  functions
# that take a timestamptz accept either
package SomewhereElse;
use MooseX::TimestampTZ gmtimestamptz => { use_z => 1 };
print gmtimestamptz 0;   # 1970-01-01 00:00:00Z

package MyClass;
use Moose;
has 'stamp' =>
        isa => "Timestamp",
        is => "rw",
        coerce => 1;

package main;
my $obj = MyClass->new(stamp => "2007-01-02 12:00:12"); # ok
$obj->stamp("2007-01-02 12:01");
$obj->stamp("2007-01-02 12");
$obj->stamp("2007-01-02 12:00:00Gibbons");  #fail

DESCRIPTION

This module provides floating dates on the Gregorian calendar without much code. It operates in (one particular variant of) ISO-8601 date format with time zone, and epoch times. Sub-second resolution is not yet supported.

FUNCTIONS

The following functions are available for import. If you want to import them all, use the :all import group, as below:

use MooseX::TimestampTZ qw(:all);

zone(Int $offset, Bool $use_z = false)

Returns the timezone of the given offset. Pass $use_z to select returning "Z" as a timezone if the offset is 0.

offset_s(Str)

Returns the offset corresponding to the given timezone. Does NOT accept nicknames like "EST", etc (which EST did you mean, US or Australian Eastern Standard Time?).

timestamptz(time_t $time_t = time(), Bool $use_z = false)

Returns the passed epoch time as a valid TimestampTZ, according to the local time zone rules in effect. $use_z functions as with zone.

gmtimestamptz(time_t $time_t = time(), Bool $use_z = false)

Returns the passed epoch time as a valid TimestampTZ, corresponding to the time in UTC. $use_z functions as with zone, and if passed this function will always return TimestampTZs ending with Z.

epoch()

Synonym for the built-in time().

epoch(TimestampTZ)

Converts the passed TimestampTZ value to an epoch time. Does not perform any coercion - the passed value must already have a time zone on it. You may omit any part of the time, specify the time zone in hours or with a Z, and optionally separate your time from your date with a T. Single digit values for fields are accepted.

Example valid forms:

2007-12-07 16:34:02+1200
2007-12-07 16:34+12
2007-12-07 04Z
2007-12-7T4Z
2007-12-7+12
2007120704:12:32    # Date::Manip format

Examples of ISO-8601 valid forms which are not currently accepted:

07-12-07Z
071207Z
20071207Z           # seperators required
2007120704Z
-12-07Z             # no year specified

No locale-specific date forms, such as / delimited dates, are accepted.

epochtz(...)

Just like epoch(), except returns the timezone as well.

TYPES AND COERCIONS

The following subtypes are defined by this module:

TimestampTZ

This is a subtype of Str which conforms to one of the two normalized forms of a TimestampTZ (either with a Z, or without).

Rules exist to coerce Str, Timestamp and time_t to this type, and are available by using the coerce => 1 flag on a Moose attribute declaration:

package Widget;
use MooseX::TimestampTZ;
has 'created' =>
        isa => TimestampTZ,
        is => "rw",
        coerce => 1;

With the above, if you set created to a time_t value, it will automatically get converted into a TimestampTZ in the current time zone.

A TimestampTZ value with a fractional second part is considered valid, regardless of whether hires is passed to the importer.

New in 0.07: Timestamp to TimestampTZ conversion now happens in local time, not UTC.

time_t

time_t is a nicer way of writing an epoch time. If you set coerce => 1 on your accessors, then you can happily pass in timestamps. As of MooseX::Timestamp 0.07, time_t is a Num, not merely an Int.

EXPORTS

The default exporting action of this module is to export the timestamptz, gmtimestamptz and epoch methods. To avoid this, pass an empty argument list to the use statement:

use MooseX::TimestampTZ ();

ISO-8601 "Z" TIMEZONE

Several of the functions which return a timezone may be told to return "Z" if the offset is 0, that is, the time is in UTC. To select this, pass a true second argument to any of the three functions (zone, timestamptz and gmtimestamptz), or curry them on import;

use MooseX::TimestampTZ qw(:default), defaults => { use_z => 1 };

You can also curry individual functions like this:

use MooseX::TimestampTZ zone => { use_z => 1 };

BUGS

This module is relatively slow, as conversions and calls to timegm and friends happen far too often, really - especially with coercion.

AUTHOR AND LICENSE

Sam Vilain, <samv@cpan.org>

Copyright 2007, Sam Vilain. All Rights Reserved. This program is Free Software; you may use it and/or redistribute it under the terms of Perl itself.