Как я могу анализировать даты и преобразовывать часовые пояса в Perl?

Я использовал функцию localtime в Perl для получения текущей даты и времени, но вам нужно проанализировать существующие даты. У меня есть дата GMT в следующем формате: «20090103 12:00» Я хотел бы проанализировать ее на объект даты, с которым я могу работать, а затем преобразовать время / дату GMT в мой текущий часовой пояс, который в настоящее время относится к восточному стандартному времени , Поэтому я хотел бы конвертировать «20090103 12:00» в «20090103 7:00», вся информация о том, как это сделать, будет очень признательна.

Поскольку интерфейсы Perl, созданные в интерфейсах обработки данных, являются неудобными, и вы обходите примерно полдюжины переменных, лучший способ – использовать либо DateTime, либо Time :: Piece . DateTime – это всепоглощающий, полностью танцующий объект даты Perl, и вы, вероятно, в конце концов захотите его использовать, но Time :: Piece является более простым и вполне адекватным для этой задачи, имеет преимущество доставки с 5.10, и эта техника в основном то же самое для обоих.

Вот простой и гибкий способ использования Time :: Piece и strptime .

#!/usr/bin/perl use 5.10.0; use strict; use warnings; use Time::Piece; # Read the date from the command line. my $date = shift; # Parse the date using strptime(), which uses strftime() formats. my $time = Time::Piece->strptime($date, "%Y%m%d %H:%M"); # Here it is, parsed but still in GMT. say $time->datetime; # Create a localtime object for the same timestamp. $time = localtime($time->epoch); # And here it is localized. say $time->datetime; 

И вот, наоборот, для контраста.

Поскольку формат фиксирован, регулярное выражение будет прекрасно, но если формат изменится, вам придется настроить регулярное выражение.

 my($year, $mon, $day, $hour, $min) = $date =~ /^(\d{4}) (\d{2}) (\d{2})\ (\d{2}):(\d{2})$/x; 

Затем преобразуйте его в эпоху Unix (секунды с 1 января 1970 года)

 use Time::Local; # Note that all the internal Perl date handling functions take month # from 0 and the year starting at 1900. Blame C (or blame Larry for # parroting C). my $time = timegm(0, $min, $hour, $day, $mon - 1, $year - 1900); 

А затем обратно в свое местное время.

 (undef, $min, $hour, $day, $mon, $year) = localtime($time); my $local_date = sprintf "%d%02d%02d %02d:%02d\n", $year + 1900, $mon + 1, $day, $hour, $min; 

Вот пример, используя DateTime и его модуль формата strptime .

 use DateTime; use DateTime::Format::Strptime; my $val = "20090103 12:00"; my $format = new DateTime::Format::Strptime( pattern => '%Y%m%d %H:%M', time_zone => 'GMT', ); my $date = $format->parse_datetime($val); print $date->strftime("%Y%m%d %H:%M %Z")."\n"; $date->set_time_zone("America/New_York"); # or "local" print $date->strftime("%Y%m%d %H:%M %Z")."\n"; $ perl dates.pl 20090103 12:00 UTC 20090103 07:00 EST - use DateTime; use DateTime::Format::Strptime; my $val = "20090103 12:00"; my $format = new DateTime::Format::Strptime( pattern => '%Y%m%d %H:%M', time_zone => 'GMT', ); my $date = $format->parse_datetime($val); print $date->strftime("%Y%m%d %H:%M %Z")."\n"; $date->set_time_zone("America/New_York"); # or "local" print $date->strftime("%Y%m%d %H:%M %Z")."\n"; $ perl dates.pl 20090103 12:00 UTC 20090103 07:00 EST 

Если бы вы хотели разобрать местное время, вот как вы это сделаете 🙂

 use DateTime; my @time = (localtime); my $date = DateTime->new(year => $time[5]+1900, month => $time[4]+1, day => $time[3], hour => $time[2], minute => $time[1], second => $time[0], time_zone => "America/New_York"); print $date->strftime("%F %r %Z")."\n"; $date->set_time_zone("Europe/Prague"); print $date->strftime("%F %r %Z")."\n"; - use DateTime; my @time = (localtime); my $date = DateTime->new(year => $time[5]+1900, month => $time[4]+1, day => $time[3], hour => $time[2], minute => $time[1], second => $time[0], time_zone => "America/New_York"); print $date->strftime("%F %r %Z")."\n"; $date->set_time_zone("Europe/Prague"); print $date->strftime("%F %r %Z")."\n"; 

Вот что я буду делать …

 #!/usr/bin/perl use Date::Parse; use POSIX; $orig = "20090103 12:00"; print strftime("%Y%m%d %R", localtime(str2time($orig, 'GMT'))); 

Вы также можете использовать Time::ParseDate и parsedate() вместо Date::Parse и str2time() . Обратите внимание, что фактический стандарт atm. похоже, DateTime (но вы можете не использовать синтаксис OO, чтобы преобразовать временную метку).

Выбирайте:

  • DateTime :: * (альтернативно, на datetime.perl.org )
  • Дата :: Manip
  • Дата :: Calc (последнее обновление в 2004 году)

Есть, конечно, миллионы других, но они, вероятно, являются главными соперниками.

 use strict; use warnings; my ($sec,$min,$hour,$day,$month,$year)=localtime(); $year+=1900; $month+=1; $today_time = sprintf("%02d-%02d-%04d %02d:%02d:%02d",$day,$month,$year,$hour,$min,$sec); print $today_time; 
  • Как анализировать дату с GMT TimeZone на IST TimeZone и наоборот в android
  • Является ли java.util.Date использованием TimeZone?
  • Лучшее время для летнего времени и часовых поясов
  • Преобразование даты и времени в другой часовой пояс в java
  • Что означает «Z» в отметке Unix «120314170138Z»?
  • DateTime vs DateTimeOffset
  • JSF convertDateTime с часовым поясом в datatable
  • Почему вычитание этих двух раз (в 1927 году) дает странный результат?
  • Каков часовой пояс по умолчанию в java.util.Date
  • Давайте будем гением компьютера.