Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

[Solved] Reading a timestamp and getting the written value

by davies (Prior)
on Sep 03, 2022 at 15:32 UTC ( [id://11146660]=perlquestion: print w/replies, xml ) Need Help??

davies has asked for the wisdom of the Perl Monks concerning the following question:

X: I want to write timestamps to a text file in a reasonably human-friendly format and then read them back, getting the same epoch second for comparison with localtime.

Y: my first attempt with Time::Piece:

use strict; use warnings; use Time::Piece; use feature 'say'; my $fmt = '%d %b %Y %T %Z'; say localtime->strftime; say localtime->strftime($fmt); my $str = '03 Sep 2022 16:10:17 GMT Daylight Time'; my $strtime = Time::Piece->strptime($str, $fmt); say localtime->epoch; say $strtime->epoch;

This returns:

Sat, 03 Sep 2022 16:10:35 GMT Daylight Time 03 Sep 2022 16:10:35 GMT Daylight Time Garbage at end of string in strptime: Daylight Time at C:/Strawberry/ +perl/lib/Time/Piece.pm line 598. Perhaps a format flag did not match the actual input? at C:/Strawberry +/perl/lib/Time/Piece.pm line 598. 1662217835 1662221417

This is out by the timezone offset. The docs tell me to look at https://www.unix.com/man-page/FreeBSD/3/strftime/, which says that %z will be treated as a numerical offset. For me, this gives the same as upper case Z, although I can't rule out the influence of Windows on this. DateTime says it won't parse dates and gives no indication I could see of how to handle localtime.

I'd be happy with UTC, but Time::Piece does not seem to support it, which is why I think I may have an XY problem. I can't believe that no-one has invented this wheel, but my searches have been fruitless and all the wheels I have tried seem square. I know that clocks moving back at the end of next month will bite me. All help gratefully received.

Regards,

John Davies

Replies are listed 'Best First'.
Re: Reading a timestamp and getting the written value
by haukex (Archbishop) on Sep 03, 2022 at 15:51 UTC
    my $fmt = '%d %b %Y %T %Z';

    Don't use %Z as it may produce ambiguous time zone names like CST ("Central Standard Time", "China Standard Time", "Cuba Standard Time", ...), and as you can tell Time::Piece's strptime can't handle parsing its own output. Personally, I usually use DateTime::Format::Strptime for parsing, but AFAICT Time::Piece works with %z as well.

    use warnings; use strict; use Time::Piece; my $fmt = '%d %b %Y %T %z'; # %z instead of %Z appears to work my $str = localtime->strftime($fmt); print $str, "\n"; my $strtime = Time::Piece->strptime($str, $fmt); print $strtime->strftime($fmt), "\n";
    use warnings; use strict; use DateTime; use DateTime::Format::Strptime; my $fmt = '%d %b %Y %T %z'; my $strp = DateTime::Format::Strptime->new( on_error=>'croak', pattern=>$fmt ); my $dt = DateTime->now; $dt->set_time_zone('America/Chicago'); # try this with "%Z"... print $dt->rfc3339, "\n"; my $str = $dt->strftime($fmt); print "$str\n"; my $dt2 = $strp->parse_datetime($str); print $dt2->rfc3339, "\n";

      Thank you; your DateTime incantations work perfectly. I was aware of the issue of ambiguous time zones, but was hoping the longer form output by Time::Piece might work. I can confirm that I have retried the capitalisation of "z" and Time::Piece remains insensitive while DateTime works as expected. It may be a function of Windows 2019 server or Strawberry (This is perl 5, version 32, subversion 1 (v5.32.1) built for MSWin32-x64-multi-thread), but with your fix I'm not investigating further.

      Regards,

      John Davies

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://11146660]
Approved by haukex
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others taking refuge in the Monastery: (5)
As of 2024-03-28 13:31 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found