50 votes

Comment convertir une date / heure en heure d'époque (aka temps unix - secondes depuis 1970) en Perl?

Étant donné une date / heure sous forme de tableau (année, mois, jour, heure, minute, seconde), comment la convertiriez-vous en temps d'époque, c'est-à-dire le nombre de secondes depuis 1970-01-01 00:00:00 GMT ?

Question bonus: si la date / heure est donnée sous forme de chaîne, comment la analyseriez-vous pour la première fois dans le tableau (y, m, d, h, m, s)?

36voto

SpoonMeiser Points 6211

Si vous utilisez le DateTime module, vous pouvez appeler l' époque() , méthode sur un objet DateTime, puisque c'est ce que vous pensez que le temps unix.

À l'aide de DateTimes vous permet de convertir assez facilement de l'époque, à la date d'objets.

Alternativly, localtime et gmtime va convertir une époque dans un tableau contenant les jour, mois et année, et timelocal et timegm à partir du Moment::module Local feront l'inverse, la conversion d'un tableau d'éléments à temps (secondes, minutes, ..., jours, mois, etc.) dans une époque.

25voto

dreeves Points 9130

C'est le moyen le plus simple pour obtenir le temps unix:

use Time::Local;
timelocal($second,$minute,$hour,$day,$month-1,$year);

Remarque l'ordre inverse de l'argument et que janvier est le mois 0. Pour beaucoup plus d'options, consultez la DateTime module CPAN.

Comme pour l'analyse, voir le Jour::Parse module CPAN. Si vous avez vraiment besoin pour obtenir la fantaisie avec la date de l'analyse, la Date::Manip peut être utile, mais de sa propre documentation vous avertit à l'écart car il porte beaucoup de bagages (il sait des choses comme le commun des affaires, des vacances, par exemple) et d'autres solutions sont beaucoup plus rapides.

Si vous connaissez quelque chose sur le format de la date/temps vous serez l'analyse d'une simple expression régulière peut suffire, mais vous êtes probablement mieux en utilisant le module CPAN. Par exemple, si vous connaissez les dates seront toujours en YMDHMS commande, utilisez le module CPAN DateTime::Format::ISO8601.


Pour ma propre référence, si rien d'autre, ci-dessous est une fonction que j'ai utiliser pour une application où je sais que les dates seront toujours en YMDHMS ordre de la totalité ou d'une partie de la "HMS" partie facultative. Il accepte tous les séparateurs (par exemple, "2009-02-15" ou "2009.02.15"). Il retourne le correspondant de temps unix (nombre de secondes depuis 1970-01-01 00:00:00 GMT), ou -1 s'il n'a pas pu l'analyser (ce qui signifie que vous feriez mieux d'être sûr que vous ne serez jamais légitimement besoin d'analyser la date 1969-12-31 23:59:59). Elle suppose également des années à deux chiffres XX jusqu'à "69" consultez "20XX", sinon "19XX" (par exemple, "50-02-15" signifie 2050-02-15 mais "75-02-15" signifie 1975-02-15).

use Time::Local;

sub parsedate { 
  my($s) = @_;
  my($year, $month, $day, $hour, $minute, $second);

  if($s =~ m{^\s*(\d{1,4})\W*0*(\d{1,2})\W*0*(\d{1,2})\W*0*
                 (\d{0,2})\W*0*(\d{0,2})\W*0*(\d{0,2})}x) {
    $year = $1;  $month = $2;   $day = $3;
    $hour = $4;  $minute = $5;  $second = $6;
    $hour |= 0;  $minute |= 0;  $second |= 0;  # defaults.
    $year = ($year<100 ? ($year<70 ? 2000+$year : 1900+$year) : $year);
    return timelocal($second,$minute,$hour,$day,$month-1,$year);  
  }
  return -1;
}

17voto

bmdhacks Points 9074

Pour analyser une date, regardez Date :: Parse dans CPAN.

8voto

ysth Points 54757
$ENV{TZ}="GMT";
POSIX::tzset();
$time = POSIX::mktime($s,$m,$h,$d,$mo-1,$y-1900);

6voto

scottc Points 201

Obtenir la Date::Manip de CPAN, puis:

use Date::Manip;
$string = '18-Sep-2008 20:09'; # or a wide range of other date formats
$unix_time = UnixDate( ParseDate($string), "%s" );

edit:

Date::Manip est gros et lent, mais très flexible dans l'analyse, et c'est de la pure perl. L'utiliser si vous êtes pressé lorsque vous écrivez du code, et vous savez que vous ne serez pas pressé quand vous êtes en cours d'exécution.

par exemple, l'Utiliser pour analyser les options de ligne de commande une fois que les start-up, mais ne l'utilisez pas l'analyse de grandes quantités de données sur un serveur web occupé.

Voir les auteurs des commentaires.

(Merci à l'auteur du premier commentaire ci-dessous)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X