Perl получает время UTC и разницу между временными отметками UTC - PullRequest
4 голосов
/ 06 февраля 2012

Мне нужна помощь Perl, как правильно это сделать.Я не против использования библиотеки для этого.

Я извлекаю метку времени UTC из базы данных mySQL в следующем формате: 2012-02-06 13: 50: 09

Мне нужен Perl для получения текущего времени UTC и получения разницы между двумя временными метками в минутах (или секундах).Я делал это в подпроцессе Unix, но у меня возникли трудности с получением времени UTC и его сравнением, так как локальное окно работает по восточному времени.Я не возражал бы делать это во время Unix, но не уверен, как точно получить время UTC для сравнения с "last_timestamp", который является меткой времени на основе UTC от mysql.

my $date_diff = qx(date -d "\$(date +'%F %T')" +%s) -
qx(date -d            "$last_timestamp" +%s); 

Как всегда ваша помощьконечно ценится и ценится.

Ответы [ 4 ]

14 голосов
/ 06 февраля 2012
  1. Ошибка парадигмы.Ящики Unix не «бегают по восточному времени» или «бегут по тихоокеанскому времени».Ящики Unix работают на «секундах с эпохи» и имеют часовой пояс по умолчанию, который используется для представления значений времени пользователям.Как только вы это поймете, множество других полезных вещей появятся бесплатно.

  2. Вы можете сделать 'date' возвращающим временем UTC, используя 'date -u'

  3. Встроенная функция Perl time возвращает секунды с начала эпохи (нет часового пояса).Затем вы можете преобразовать это в значения UM YMDHMS, используя встроенную функцию Perl gmtime.Вызов gmtime без каких-либо аргументов практически такой же, как gmtime(time).

  4. Использование DateTime :: Format :: MySQL дляразбирать MySQL даты / времени.Вы также можете найти DateTime полезным.Также см. http://datetime.perl.org/

2 голосов
/ 06 февраля 2012

Один из способов - использовать ядро ​​ Время :: Кусок

#!/usr/bin/env perl
use strict;
use warnings;
use Time::Piece;
my $when = q(2012-02-06 13:50:09);
my $t = Time::Piece->strptime( $when, "%Y-%m-%d %H:%M:%S" );
print "delta seconds = ", time() - $t->strftime("%s"),"\n";
1 голос
/ 06 февраля 2012

Вот решение с использованием DateTime

use strict;
use warnings;
use DateTime;

my $date_str="2012-02-06 13:50:09";

my ($year,$month,$day,$hour,$min,$sec);

if($date_str=~/^(\d{4})\-(\d{2})\-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/)
{
  $year=$1;
  $month=$2;
  $day=$3;
  $hour=$4;
  $min=$5;
  $sec=$6;
}
else
{
  die "Couldn't parse timestamp $date_str\n";
}

my $dt=DateTime->new(
  year=>$year,
  month=>$month,
  day=>$day,
  hour=>$hour,
  minute=>$min,
  second=>$sec,
  time_zone=>"UTC"
);

my $now=DateTime->now;
$now->set_time_zone("UTC");

my $difference=$now->delta_ms($dt);

print "The difference is " . (60*($difference->minutes) + ($difference->seconds)) . " seconds\n";

Вывод:

The difference is 2078 seconds

что звучит примерно так.

0 голосов
/ 06 февраля 2012
  1. Звоните time
  2. Извлечение UNIX_TIMESTAMP (your_datetime_field) из MySQL
  3. Вычтите.
  4. Див и мод 60.
  5. sprintf ("%02d min %02d s", $delta_min, $delta_s);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...