2017-09-26 14 views
-2

Est-il possible de convertir un horodatage donné en GMT en Perl à l'aide du module POSIX? Voici ce que je l'ai essayé, mais ne sais pas pourquoi le temps est si loin ...Conversion d'un horodatage en GMT avec POSIX

use POSIX; 
my $shipts = "2017-09-23 20:53:00"; 
my $shiptsgmt = strftime("%Y-%m-%d %R", localtime(str2time($shipts, 'GMT'))); 
print "$shiptsgmt\n"; 

Le localtime du serveur est l'heure du Pacifique, devinez ce que je suis en train de faire est incorrecte. Ce qui précède produit 2017-09-23 13:53 et j'ai besoin 2017-09-24 03:53 temps.

+0

Qu'est-ce que 'str2time'? – toolic

+0

utilisation POSIX autorise str2time. – rwfitzy

+0

Je ne le vois pas dans les documents POSIX (v5.16 et v5.27) ... – zdim

Répondre

3

Le POSIX seul ne peut pas le faire, non sans l'aide de builtins et un peu de traitement.

Une alternative: Time::Piece est coeur et dans mon expérience beaucoup plus rapide que Posix

perl -MTime::Piece -wE' 
    $d = "2017-09-23 20:53:00"; 
    $t = localtime->strptime($d, "%Y-%m-%d %H:%M:%S"); 
    $t = gmtime($t->epoch); 
    say $t->strftime("%Y-%m-%d %H:%M:%S"); 
' 

Cela crée un objet et il convertit ensuite GMT en utilisant pour remplacer gmtime du module (compatible), returing un objet est également signalé comme GMT.

Le strftime est le même, mais beaucoup plus léger que l'extension POSIX et strptime est from FreeBSD. Le module dispose également de nombreuses méthodes pour obtenir diverses parties ou représentations de l'objet datetime sous la forme d'une chaîne, avec quelques autres utilitaires. Voir aussi Time::Seconds.

Le DateTime fait tout cela bien, via son formatters pour l'analyse et la stringification. Mais c'est lourd.


Remarque   Il est assez facile de mettre fin à l'aide de ce module correctement, et cette réponse a fait juste avant que ikegami le fixe. Donc s'il vous plaît soyez très prudent avec toutes les utilisations autres que de base. Voir les réponses liées

Notez que la réponse ci-dessus fonctionne pas dans v5.10, apparemment en raison d'un bug alors dans le module.

+0

@ikegami Merci. J'ai édité, avec l'information sur votre poste que j'ai maintenant trouvé qui traite directement de cette erreur (et un autre ancien poste que c'est apparemment dupe de). J'ajouterai des liens plus appropriés si je les trouve. (J'ai effacé certains de mes commentaires pour rendre votre avertissement plus visible.) – zdim

+0

@ikegami Si je peux vous bousiller avec une question.J'ai écrit un utilitaire sous-classe 'Time :: Piece' (soigneusement!) Pour des utilisations particulières ici, et cela fonctionne comme un charme. Mais je ne pourrais jamais trouver de pièce avec ceci: Y at-il des défauts à ce module, avec des cas de bord, DST, jours sans minuit, ou tel? (Sans compter l'astuce et les erreurs de l'utilisateur.) Je pense à des utilisations assez basiques, pour les dattes du monde entier au cours du siècle dernier. J'ai cherché et cherché et n'ai rien trouvé à craindre mais c'est une affaire délicate. Alors que l'on ne peut pas demander quelque chose comme ça ici :( – zdim

+0

Il utilise 'localtime' pour les trucs de fuseau horaire, donc pas de problèmes d'intérêt là-bas.Le problème avec T :: P est qu'il est facile de faire des choses incorrectement avec lui. Échec de la conception de l'API, pas un bogue dans le code.Le sous-classement pourrait hériter de ces problèmes.Ce n'est pas le cas de l'encapsulation – ikegami