Hi DateTime enthusiasts,

DateTime::Format::* objects are accepting a 'time_zone' argument,
which lets you conveniently set the time zone in the DateTime
object returned by parse_datetime().

However, DateTime::Format::Strptime (and other formatters) serve
another purpose as well: They're used as output formatters, set via
DateTime's set_formatter() method, and controlling the stringification
of the DateTime object.

Now, regardless what the time_zone setting is in a DateTime's formatter,
the stringified representation of it remains the same.

That's quite confusing. I think the formatter should either convert the
DateTime object's datetime to the formatter's time_zone or the output
formatter shouldn't offer a time_zone setting (therefore be different
from the parse input formatter which needs it).

Here's the status quo, showing that the time_zone setting of the
formatter doesn't affect the output.

    use DateTime;
    use DateTime::Format::Strptime;

    my $format1 = new DateTime::Format::Strptime(
      pattern => "%Y/%m/%d %H:%M:%S",
      time_zone => 'Asia/Tokyo' );

    my $format2 = new DateTime::Format::Strptime(
      pattern => "%Y/%m/%d %H:%M:%S",
      time_zone => 'America/Los_Angeles' );

    my $dt = DateTime->new(
            year  => 2006,
            month => 1,
            day   => 1,
            hour  => 1);

        # 2006-01-01T01:00:00
    print "$dt\n";

    $dt->set_formatter($format1);

        # 2006/01/01 01:00:00
    print "$dt\n";

    $dt->set_formatter($format2);

        # 2006/01/01 01:00:00
    print "$dt\n";

What do you think?

Another thing I found counter-intuitive was that if parse_datetime() is
used with a formatter that doesn't have a time zone, it returns a
DateTime object, which, if you set its time zone, changes its
value:

    use DateTime;
    use DateTime::Format::Strptime;

    my $format = new DateTime::Format::Strptime(
       pattern => "%Y/%m/%d %H:%M:%S",
    );

    my $dt = $format->parse_datetime(
       "2006/01/01 05:00:00");

    $dt->set_time_zone("Asia/Tokyo");

        # Prints "2006-01-01T14:00:00"
    print "$dt\n";

Shouldn't parse_datetime() create a DateTime object with a floating time zone
in this case?

Anyway, great work, guys!

-- Mike

Mike Schilli
[EMAIL PROTECTED]

Reply via email to