7
votes

Comment puis-je modifier le fuseau horaire d'une valeur DateTime à Perl?

Utilisation de cette fonction:

perl -e 'use Time::Local; print timelocal("00","00","00","01","01","2000"),"\n";'


0 commentaires

7 Réponses :


2
votes

Vous avez juste besoin de définir le fuseau horaire. Essayez:

env TZ=UTC+1 perl -e 'use Time::Local; print timelocal("00","00","00","01","01","2000"),"\n";'


2 commentaires

Timezones TLA sont ambiguës et mal définis. Il est préférable d'utiliser ZoneInfo Noms: TZ = Europe / Berlin Perl ...


Voici un lien directement au Liste des chaînes de fuseau horaire valides AKA ZONE.TAB .



4
votes

Il n'y a qu'une seule définition standard pour EPOCHTIME, basée sur l'UTC, et non des épochtimes différents pour différents fuseaux horaires.

Si vous souhaitez trouver le Décalage entre GMTime et localTime , utilisez P>

use Time::Local;
@t = localtime(time);
$gmt_offset_in_seconds = timegm(@t) - timelocal(@t);


0 commentaires

2
votes

heure :: local :: timelocal code> est l'inverse de localTime code>. Le résultat sera dans l'heure locale de votre hôte:

$ perl -MTime::Local -le \
    'print scalar localtime timegm "00","00","00","01","01","2000"'
Tue Feb  1 01:00:00 2000


0 commentaires

3
votes

Pendant le temps :: Local est une solution raisonnable, vous risquez peut-être d'utiliser le module d'objet DateTime plus moderne. Voici un exemple: xxx pré>

pour les fuseaux horaires, vous pouvez utiliser le module DateTime :: Timezone. P>

use strict;
use DateTime;
use DateTime::TimeZone;

my $dt = DateTime->now;
my $tz = DateTime::TimeZone->new(name => "local");

$dt->add(seconds => $tz->offset_for_datetime($dt));

print $dt->epoch, "\n";


0 commentaires

9
votes
use DateTime;
my $dt   = DateTime->now;
$dt->set_time_zone( 'Europe/Madrid' );

1 commentaires

Réponse très propre. Voici une liste de fuseaux horaires: en.wikipedia.org/wiki/list_of_tz_database_Time_zones



0
votes

Un autre exemple basé sur DateTime :: Format :: Strptime < Pré> xxx


0 commentaires

0
votes

L'algorithme

Si vous souhaitez modifier une valeur temporelle d'un fuseau horaire à un autre fuseau horaire, vous devez être capable de Indiquez les deux trimestres. strong> p> p> p> P>

Après tout, si vous définissez si vous souhaitez convertir "12:30" code> sur le temps GMT ou US / Est ou vénézuélien, ce qui signifie ajouter / soustraire une quantité d'heures ou d'heures et de minutes, Vous devez savoir quel fuseau horaire est le fuseau horaire de départ, em> autrement, le calcul ne saura pas combien d'ajouter ou de soustraire. p>

si vous utilisez DateTime-> maintenant; code>, le fuseau horaire est en panne sur le temps système, ce qui peut ne pas être le fuseau horaire que vous souhaitez convertir de. Em> p>

dans le code ci-dessous, je démontre Comment initialiser l'objet DateTime à la droite Démarrage Timezone ( depuis tempszone >) et comment convertir cette heure à l'horaire de fin ( TOTHZONE code>) ... P>

Code de travail h3>

Je n'ai pas pu trouver un Perl Sandbox Online avec le module code> DateTime CPPAN INSTALLÉ INSTALLÉ. P>

use strict;
use DateTime;

sub convertTimeZonesForTime {
        my ($args) = @_;

        my $time = $args->{time};
        my $date = $args->{date};
        my $totimezone = $args->{totimezone};
        my $fromtimezone = $args->{fromtimezone};
        my $format = $args->{format} || '%H:%M:%S';

        my ($year, $month, $day) = map {int $_} split('-', $date);
        my ($hour, $minute, $second) = map {int $_} split(':', $time);

        $year ||= 1999 if !defined $year;
        $month ||= 1 if !defined $month;
        $day ||= 1 if !defined $day;
        $hour ||= 12 if !defined $hour;
        $minute ||= 30 if !defined $minute;
        $second ||= 0 if !defined $second;

        my $dt = DateTime->new(
                year=>$year,
                month=>$month,
                day=>$day,
                hour=>$hour,
                minute=>$minute,
                second=>$second,
                time_zone => $fromtimezone,
        );
        my $formatter = new DateTime::Format::Strptime(pattern => $format);
        $dt->set_formatter($formatter);
        $dt->set_time_zone($totimezone);

        return "$dt";
}

print(convertTimeZonesForTime({
    'totimezone'=>'America/Denver',
    'fromtimezone'=>'US/Eastern',
    'time'=>'12:30:00',
}));


0 commentaires