NAME
Time::P - Parse times from strings.
VERSION
version 0.024
SYNOPSIS
use Time::P; # strptime() automatically exported.
use Time::C;
# "2016-10-30T16:07:34Z"
my $t = Time::C->mktime(strptime("sön okt 30 16:07:34 UTC 2016", "%a %b %d %T %Z %Y", locale => "sv_SE"));
DESCRIPTION
Parses a string to get a time out of it using "Format Specifiers" reminiscent of C's scanf and indeed strptime functions.
FUNCTIONS
strptime
my %struct = strptime($str, $fmt);
my %struct = strptime($str, $fmt, locale => $locale, strict => $strict, struct => \%struct);
strptime takes a string and a format which it parses the string with, and returns key-value pairs of the parsed bits of time.
$str-
$stris the string to parse. $fmt-
$fmtis the format specifier used to parse the$str. If it can't match$strit will throw an exception. See "Format Specifiers" for details on the supported format specifiers. locale => $locale-
$localeis an optional parameter which defaults toC. It is used to determine how the format specifiers%a,%A,%b,%B,%c,%p, and%rmatch. See "Format Specifiers" for more details. strict => $strict-
$strictis an optional boolean flag which defaults to true. If it is a true value, the$fmtmust describe the string entirely. If it is false, the$fmtmay describe only part of the string, and any extra bits, either before or after, are discarded. struct => \%struct-
If passed a reference to a hash
%struct, that hash will be updated with the bits that were parsed from the string. The hash will also be equal to the key-value pairs being returned. If it is not supplied, a reference to an empty hash will be used in its stead.
If the format reads in a timezone that isn't well-defined, it will be silently ignored, and any offset that is parsed will be used instead.
See "mktime" in Time::C for making a Time::C object out of the returned structure. Or see "strptime" in Time::C for a constructor that will do it for you.
Format Specifiers
The format specifiers work in a format to parse distinct portions of a string. Any part of the format that isn't a format specifier will be matched verbatim. All format specifiers start with a % character. Some implementations of strptime will support some of them, and other implementations will support others.
Some format specifiers can have a - inserted between the % and the letter, and if so they will no longer need any leading whitespace or 0 to be matched. The ones which support this are: %-C, %-d, %-e, %-G, %-g, %-H, %-I, %-j, %-k, %-l, %-M, %-m, %-S, %-U, %-V, %-W, %-Y, and %-y.
This implementation will support the ones described below:
%A-
Full weekday, depending on the locale, e.g.
söndag. %a-
Abbreviated weekday, depending on the locale, e.g.
sön. %B-
Full month name, depending on the locale, e.g.
oktober. %b-
Abbreviated month name, depending on the locale, e.g.
okt. %C-
2 digit century, e.g.
20-20actually means the21stcentury.If you specify
%-C, it will be 1 or 2 digits if the century is low enough. %c-
The date and time representation for the current locale, e.g.
sön okt 30 16:07:34 UTC 2016. %D-
Equivalent to
%m/%d/%y, e.g.10/30/16- this is used mostly in the US. Internationally%Fis much preferred. %d-
2 digit day of month, e.g.
30.If you specify
%-d, it will be 1 or 2 digits if the day of the month is low enough. %E*-
The
%E*format specifiers that are supported are:%Ec-
Similar to
%c, but using an alternate way of displaying the year. See%EY,%EC, and%Ey. %EC-
Similarly to
%C, it (usually) describes a period longer than 1 year, depending on the locale. There are only a few locales that define this:ja_JP,lo_LA, andth_TH; in other locales it functions like%C.Taking the
ja_JPlocale as an example, it defines a number of periods, ostensibly relating to when they got a new emperor, and these periods are what the%ECrepresents rather than centuries like%C. %EX-
Similar to
%x, but using an alternate way of displaying the time. There are only a few locales that define this:lo_LA, andth_TH; in other locales it functions like%X. %Ex-
Similar to
%X, but using an alternate way of displaying the year. There are only a few locales that define this:ja_JP,lo_LA, andth_TH; in other locales it functions like%x. See%EY,%EC, and%Eyfor details on how the year is displayed. %EY-
Similarly to
%Y, it describes a year fully, but depends on the%ECand possibly the%Eyof the locale. There are only a few locales that define this:ja_JP,lo_LA, andth_TH; in other locales it functions like%Y. %Ey-
Similarly to
%y, it describes the number of years since the period, only%y's period is%C, while%Ey's period is%EC. There are only a few locales that define this:ja_JP,lo_LA, andth_TH; in other locales it functions like%y.
%e-
1/2 digit day of month, space padded, e.g.
30.If you specify
%-e, it will not be space padded if it is low enough. %F-
Equivalent to
%Y-%m-%d, e.g.2016-10-30. %G-
Year, 4 digits, representing the week-based year since year 0, e.g.
2016- i.e. if the date being represented has a week that overlaps with the previous or next year, the year for any date in that week will count as the year that has 4 or more days of the week in it, counting from Monday til Sunday. Should be combined with a%Vweek specifier (a%Wor%Uweek specifier will not work).If you specify
%-G, it will be 1, 2, 3, or 4 digits if the year is low enough. %g-
Like
%Gbut without century, and which will be interpreted as being within 50 years of the current year, whether that means adding 1900 or 2000 to it, e.g.16.If you specify
%-g, it will be 1 or 2 digits if the year is low enough. %H-
2 digit hour in 24-hour time, e.g.
16.If you specify
%-H, it will be 1 or 2 digits if the hour is low enough. %h-
Equivalent to
%b, e.g.okt. %I-
2 digit hour in 12-hour time, e.g.
04.If you specify
%-I, it will be 1 or 2 digits if the hour is low enough. %j-
3 digit day of the year, e.g.
304.If you specify
%-j, it will be 1, 2, or 3 digits if the day of the year is low enough. %k-
1/2 digit hour in 24-hour time, space padded, e.g.
16.If you specify
%-k, it will not be space padded if it is low enough. %l-
1/2 digit hour in 12-hour time, space padded, e.g.
4.If you specify
%-l, it will not be space padded if it is low enough. %M-
2 digit minute, e.g.
07.If you specify
%-M, it will be 1 or 2 digits if the minute is low enough. %m-
2 digit month, e.g.
10.If you specify
%-m, it will be 1 or 2 digits if the month is low enough. %n-
Arbitrary whitespace, like
m/\s+/- if used as a formatting specifier rather than a parsing specifier, it will result in a\n(i.e. a newline). %O*-
The
%O*format specifiers work like their non-Ocounterparts, except they use an alternate set of digits for representing the number depending on the locale. Not all%O*specifiers are actually supported by all locales, as some only define numbers up to a certain point. Some don't specify an alternate set of digits at all, in which case they should work exactly like their non-Ocounterparts.The
%O*format specifiers that are supported are: %p-
Matches the locale version of
a.m.orp.m., if the locale has that. Otherwise matches the empty string. %X-
The time representation for the current locale, e.g.
16:07:34. %x-
The date representation for the current locale, e.g.
2016-10-30. %R-
Equivalent to
%H:%M, e.g.16:07. %r-
The time representation with am/pm for the current locale. For example in the
POSIXlocale, it is equivalent to%I:%M:%S %p. %S-
2 digit second, e.g.
34.If you specify
%-S, it will be 1 or 2 digits if the second is low enough. %s-
The epoch, i.e. the number of seconds since
1970-01-01T00:00:00Z. %T-
Equivalent to
%H:%M:%S, e.g.16:07:34. %t-
Arbitrary whitespace, like
m/\s+/- if used as a formatting specifier rather than a parsing specifier, it will result in a\t(i.e. a tab). %U-
2 digit week number of the year, Sunday-based week, e.g.
44.If you specify
%-U, it will be 1 or 2 digits if the week is low enough. %u-
1 digit weekday, Monday-based week, e.g.
7. %V-
2 digit week number of the year, Monday-based week, e.g.
43, where week1is the first week of the year that has 4 days or more. Any preceding days will belong to the last week of the prior year, see%G.If you specify
%-V, it will be 1 or 2 digits if the week is low enough. %v-
Equivalent to
%e-%b-%Y, which depends on the locale, e.g.30-okt-2016. %W-
2 digit week number of the year, Monday-based week, e.g.
43.If you specify
%-W, it will be 1 or 2 digits if the week is low enough. %w-
1 digit weekday, Sunday-based week, e.g.
0. %Y-
Year, 4 digits, representing the full year since year 0, e.g.
2016.If you specify
%-Y, it will be from 1 to 4 digits if the year is low enough. %y-
2 digit year without century, which will be interpreted as being within 50 years of the current year, whether that means adding 1900 or 2000 to it, e.g.
16.If you specify
%-y, it will be 1 or 2 digits if the year is low enough. %Z-
Time zone name, e.g.
CET, orEurope/Stockholm. %z-
Offset from UTC in hours and minutes, or just hours, e.g.
+0100. %%-
A literal
%sign.
SEE ALSO
- Time::C
-
The companion to this module, which can create an actual time representation from the structure we parsed.
- Time::Piece
-
Also provides a
strptime(), but it doesn't deal well with timezones or offsets. - POSIX::strptime
-
Also provides a
strptime(), but it also doesn't deal well with timezones or offsets. - Time::Strptime
-
Also provides a
strptime(), but it doesn't handle%c,%x, or%Xformat specifiers at all, only supports aPOSIXversion of%r, and is arguably buggy with%a,%A,%b,%B, and%p. - DateTime::Format::Strptime
-
Provides an OO-interface for strptime, but it has the same issues as
Time::Strptime.
AUTHOR
Andreas Guldstrand <andreas.guldstrand@gmail.com>
COPYRIGHT AND LICENSE
This software is Copyright (c) 2016 by Andreas Guldstrand.
This is free software, licensed under:
The MIT (X11) License