PHP εξοικονόμηση ανίχνευση διάρκεια της ημέρας

ψήφοι
25

Θα πρέπει να στείλετε ένα e-mail στους χρήστες με βάση οπουδήποτε στον κόσμο και στις 9:00 π.μ., τοπική ώρα. Ο διακομιστής είναι στο Ηνωμένο Βασίλειο. Τι μπορώ να κάνω έχει συσταθεί μια διαφορά ώρας μεταξύ του κάθε χρήστη και την ώρα του server, το οποίο στη συνέχεια θα λειτουργούν τέλεια, αν θερινής ώρας δεν υπήρχε.

Εδώ είναι ένα παράδειγμα για να το δείχνουν:

  • Ο John εργάζεται στη Νέα Υόρκη, -5 ώρες από το διακομιστή (UK) χρόνο
  • Richard εργάζεται στο Λονδίνο, Ηνωμένο Βασίλειο, οπότε μηδέν ώρες διαφορά με το διακομιστή.

Όταν ο διακομιστής πηγαίνει από GMT σε GMT +1 (BST) στις 2:00 π.μ. ένα συγκεκριμένο Κυριακή, αυτό σημαίνει ότι ο John έχει τώρα μια 6Η χρονική διαφορά τώρα.

Αυτό το σενάριο μπορώ ακόμα να χειριστεί, ενημερώνοντας όλους τους χρήστες εκτός τοπική ώρα του server, αλλά από τη στιγμή που έχω μετακινηθεί προς τα εμπρός / προς τα πίσω ο χρόνος από όλους τους άλλους χρήστες, θα πρέπει ακόμα έναν τρόπο να ανιχνεύσει πότε (ημερομηνία και ώρα) οι χρήστες που ζουν εκτός του Ηνωμένου Βασιλείου θα (ή δεν θα) αλλάζουν τοπική ώρα τους σε ένα πιθανό ένα θερινής ώρας.

Χρειάζομαι μια μέθοδο PHP να ξέρετε / ανιχνεύσει πότε άλλα μέρη του κόσμου θα τεθεί / DST έξοδο.

Δημοσιεύθηκε 27/05/2011 στις 17:35
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
12

Αλλαγή απάντησή μου λίγο: DateTimeZone :: getTransitions φαίνεται ότι θα κάνει ό, τι χρειάζεστε, εφόσον έχετε PHP> = 5.2.

Από ένα σχόλιο στην τεκμηρίωση:

<?php 
$theTime = time(); // specific date/time we're checking, in epoch seconds. 

$tz = new DateTimeZone('America/Los_Angeles'); 
$transition = $tz->getTransitions($theTime, $theTime); 

// only one array should be returned into $transition. Now get the data: 
$offset = $transition[0]['offset']; 
$abbr = $transition[0]['abbr']; 
?>

Μέχρι εδώ, το μόνο που χρειάζεται να κάνετε είναι να περάσει στη ζώνη ώρας που θέλετε να ελέγξετε και να μπορούμε να γνωρίζουμε αν αυτό ζώνη ώρας είναι σε θερινής ώρας / ποια είναι η μετατόπιση είναι. Στη συνέχεια, θα πρέπει να ελέγξετε το συμψηφίζονται GMT για να δείτε αν θέλετε να στείλετε e-mail σας τώρα, ή όχι τώρα.

Απαντήθηκε 27/05/2011 στις 17:40
πηγή χρήστη

ψήφοι
23

Μήπως θα πρέπει να γνωρίζετε όλες τις λεπτομέρειες της θερινής ώρας μετάβαση στον εαυτό σας; ή μήπως το μόνο που χρειάζεται να γνωρίζουν πότε είναι 09 πμ σε μια δεδομένη ζώνη ώρας;

Αν είναι το τελευταίο, PHP μπορεί να χρησιμοποιήσει τη βάση δεδομένων ζώνης ώρας του λειτουργικού σας συστήματος για να το κάνουμε αυτό για σας. Η strtotime () λειτουργία είναι εξαιρετικά καλή στο «υπολογίζει» τι εννοείτε:

echo strtotime("today 9:00 am America/New_York");  // prints "1306501200"
echo strtotime("today 9:00 am Europe/London");     // prints "1306483200"

Απλά φροντίστε να χρησιμοποιείτε ένα από τα PHP υποστηρίζεται ζώνες ώρας .

Απαντήθηκε 27/05/2011 στις 19:40
πηγή χρήστη

ψήφοι
19

Όπως ο Jimmy επισημαίνει μπορείτε να χρησιμοποιήσετε τις μεταβάσεις ζώνη ώρας, αλλά αυτό δεν είναι διαθέσιμο για PHP <5.3. όπως dateTimeZone () είναι η PHP> = 5.2.2, αλλά getTransitions () με επιχειρήματα δεν είναι! Στην περίπτωση αυτή εδώ είναι μια λειτουργία που μπορεί να σας δώσει τη ζώνη ώρας δεδομένων, συμπεριλαμβανομένου του κατά πόσο το DST ή όχι.

function timezonez($timezone = 'Europe/London'){
    $tz = new DateTimeZone($timezone);
    $transitions = $tz->getTransitions();
    if (is_array($transitions)){
        foreach ($transitions as $k => $t){
            // look for current year
            if (substr($t['time'],0,4) == date('Y')){
                $trans = $t;
                break;
            }
        }
    }
    return (isset($trans)) ? $trans : false;
}

Τούτου λεχθέντος, υπάρχει μια απλούστερη μέθοδος που χρησιμοποιεί σήμερα (), αν το μόνο που χρειάζεται να γνωρίζουν εάν ένα ζώνη ώρας είναι σε θερινής ώρας. Για παράδειγμα, αν θέλετε να ξέρετε αν το Ηνωμένο Βασίλειο είναι σε θερινής ώρας μπορείτε να το κάνετε αυτό:

date_default_timezone_set('Europe/London');
$bool = date('I'); // this will be 1 in DST or else 0

... ή να προμηθεύουν μια χρονική σήμανση ως δεύτερη arg μέχρι σήμερα () αν θέλετε να ορίσετε μια datetime, εκτός από την τρέχουσα ώρα του διακομιστή σας.

Απαντήθηκε 14/06/2012 στις 13:02
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more