time и now
Две функции, которые возвращают текущее время (по крайней мере, то значение, которое ваше система принимает за текущее) – это time и now. Пример:
> say time; say now;
1292460064
Instant:2010-12-16T00:41:4.873248Z
Первая очевидная разница – time возвращает POSIX в целочисленном виде. now возвращает объект под названием Instant. Если вам нужны доли секунд и распознавание секунд координации времени, используйте now.
DateTime и его друзья
Большую часть времени вам нужно хранить даты, отличающиеся от now. Для этого используется объект DateTime. Для сохранения текущего времени:
my $moment = DateTime.new(now); # or DateTime.new(time)
Есть ещё два способа создания объекта:
my $dw = DateTime.new(:year(1963), :month(11), :day(23), :hour(17), :minute(15));
Это в UTC. Если вам необходима другая временная зона, используйте дополнение :timezone. В нашем случае обязателен только :year, остальное будет по умолчанию равно 1 января.
Это довольно сложный способ. Можно создать объект DateTime через ISO 8601 timestamp, в виде строки:
my $dw = DateTime.new("1963-11-23T17:15:00Z");
Z означает UTC. Можно заменить Z на +hhmm или -hhmm, где ‘hh’ – смещение в часах, а ‘mm’ – в минутах.
Ещё есть объект Date, который создаётся так же, но без часов, минут и секунд:
my $jfk = Date.new("1963-11-22"); # и также вы можете использовать :year и другие префиксы
Иногда вам требуется работать с днями, не заботясь о временных зонах и секундах коррекции. Гораздо проще работать с чистыми датами. Например, у Date есть встроенные методы .succ и .pred, поэтому можно инкрементировать и декрементировать их как угодно:
$jfk++; # День после JFK