/
P5localtime.pm6
202 lines (148 loc) · 6.55 KB
/
P5localtime.pm6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
use v6.c;
unit module P5localtime:ver<0.0.6>:auth<cpan:ELIZABETH>;
use NativeCall;
my class TimeStruct is repr<CStruct> {
has int32 $.tm_sec;
has int32 $.tm_min;
has int32 $.tm_hour;
has int32 $.tm_mday;
has int32 $.tm_mon;
has int32 $.tm_year;
has int32 $.tm_wday;
has int32 $.tm_yday;
has int32 $.tm_isdst;
has long $.tm_gmtoff;
has Str $.tm_zone;
method list() {
($.tm_sec, $.tm_min, $.tm_hour, $.tm_mday, $.tm_mon, $.tm_year,
$.tm_wday,$.tm_yday,$.tm_isdst,$.tm_gmtoff,$.tm_zone)
}
}
# actual NativeCall interfaces
my sub get-localtime(int64 is rw --> TimeStruct)
is native is symbol<localtime> {*}
my sub get-ctime(int64 is rw --> Str)
is native is symbol<ctime> {*}
my sub get-gmtime(int64 is rw --> TimeStruct)
is native is symbol<gmtime> {*}
# actual exported subs
my proto sub localtime(|) is export {*}
multi sub localtime(Scalar:U, Int() $time = time) {
my int64 $epoch = $time;
get-ctime($epoch).chomp
}
multi sub localtime(Int() $time = time, :$scalar!)
is DEPRECATED('Scalar as first positional')
{
localtime(Scalar, $time)
}
multi sub localtime(Int() $time = time) {
my int64 $epoch = $time;
get-localtime($epoch).list
}
my proto sub gmtime(|) is export {*}
multi sub gmtime(Scalar:U, Int() $time = time) {
my int64 $epoch = $time;
$epoch -= get-localtime($epoch).tm_gmtoff;
get-ctime($epoch).chomp
}
multi sub gmtime(Int() $time = time, :$scalar!)
is DEPRECATED('Scalar as first positional')
{
gmtime(Scalar, $time)
}
multi sub gmtime(Int() $time = time) {
my int64 $epoch = $time;
get-gmtime($epoch).list
}
=begin pod
=head1 NAME
P5localtime - Implement Perl 5's localtime / gmtime built-ins
=head1 SYNOPSIS
use P5localtime;
# 0 1 2 3 4 5 6 7 8
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
say localtime(Scalar, time);
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime(time);
say gmtime(Scalar, time);
=head1 DESCRIPTION
This module tries to mimic the behaviour of the C<localtime> and C<gmtime>
functions of Perl 5 as closely as possible.
=head1 ORIGINAL PERL 5 DOCUMENTATION
localtime EXPR
localtime
Converts a time as returned by the time function to a 9-element
list with the time analyzed for the local time zone. Typically
used as follows:
# 0 1 2 3 4 5 6 7 8
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime(time);
All list elements are numeric and come straight out of the C
`struct tm'. $sec, $min, and $hour are the seconds, minutes, and
hours of the specified time.
$mday is the day of the month and $mon the month in the range
0..11, with 0 indicating January and 11 indicating December. This
makes it easy to get a month name from a list:
my @abbr = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
print "$abbr[$mon] $mday";
# $mon=9, $mday=18 gives "Oct 18"
$year contains the number of years since 1900. To get a 4-digit
year write:
$year += 1900;
To get the last two digits of the year (e.g., "01" in 2001) do:
$year = sprintf("%02d", $year % 100);
$wday is the day of the week, with 0 indicating Sunday and 3
indicating Wednesday. $yday is the day of the year, in the range
0..364 (or 0..365 in leap years.)
$isdst is true if the specified time occurs during Daylight Saving
Time, false otherwise.
If EXPR is omitted, "localtime()" uses the current time (as
returned by time(3)).
In scalar context, "localtime()" returns the ctime(3) value:
$now_string = localtime; # e.g., "Thu Oct 13 04:54:34 1994"
The format of this scalar value is not locale-dependent but built
into Perl. For GMT instead of local time use the "gmtime" builtin.
See also the "Time::Local" module (for converting seconds,
minutes, hours, and such back to the integer value returned by
time()), and the POSIX module's strftime(3) and mktime(3)
functions.
To get somewhat similar but locale-dependent date strings, set up
your locale environment variables appropriately (please see
perllocale) and try for example:
use POSIX qw(strftime);
$now_string = strftime "%a %b %e %H:%M:%S %Y", localtime;
# or for GMT formatted appropriately for your locale:
$now_string = strftime "%a %b %e %H:%M:%S %Y", gmtime;
Note that the %a and %b, the short forms of the day of the week
and the month of the year, may not necessarily be three characters
wide.
The Time::gmtime and Time::localtime modules provide a convenient,
by-name access mechanism to the gmtime() and localtime()
functions, respectively.
For a comprehensive date and time representation look at the
DateTime module on CPAN.
Portability issues: "localtime" in perlport.
gmtime EXPR
gmtime Works just like "localtime" but the returned values are localized
for the standard Greenwich time zone.
Note: When called in list context, $isdst, the last value returned
by gmtime, is always 0. There is no Daylight Saving Time in GMT.
Portability issues: "gmtime" in perlport.
=head2 PORTING CAVEATS
Since Perl 6 does not have a concept of scalar context, this must be mimiced
by passing the C<Scalar> type as the first positional parameter.
The implementation actually also returns the offset in GMT in seconds as
element number 9, and the name of the timezone as element number 10, if
supported by the OS.
=head1 AUTHOR
Elizabeth Mattijsen <liz@wenzperl.nl>
Source can be located at: https://github.com/lizmat/P5localtime . Comments and
Pull Requests are welcome.
=head1 ACKNOWLEDGEMENTS
JJ Merelo, Jan-Olof Hendig, Tobias Leich, Timo Paulssen and Christoph (on
StackOverflow) for support in getting this to work.
=head1 COPYRIGHT AND LICENSE
Copyright 2018-2019 Elizabeth Mattijsen
Re-imagined from Perl 5 as part of the CPAN Butterfly Plan.
This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.
=end pod