Προσδιορίστε πεδίου του Χρήστη

ψήφοι
529

Υπάρχει κάποιος τυπικός τρόπος για έναν Web server για να είναι σε θέση να προσδιορίσει τη ζώνη ώρας του χρήστη σε μια ιστοσελίδα εκεί;

Ίσως από μια κεφαλίδα ΗΤΤΡ ή μέρος της συμβολοσειράς χρήστη-πράκτορα;

Δημοσιεύθηκε 01/08/2008 στις 01:42
πηγή χρήστη
Σε άλλες γλώσσες...                            


25 απαντήσεις

ψήφοι
302
-new Date().getTimezoneOffset()/60;

Η μέθοδος getTimezoneOffset()θα αφαιρέσει το χρόνο σας από το GMT και να επιστρέψει τον αριθμό των λεπτών. Έτσι, αν ζείτε σε GMT-8, θα επιστρέψει 480.

Για να το θέσουμε σε ώρες, διαιρέστε με 60. Επίσης, παρατηρήστε ότι το σημείο είναι το αντίθετο από ό, τι χρειάζεστε - είναι υπολογισμό GMT για μετατόπιση από τη ζώνη ώρας σας, δεν σας ζώνη ώρας είναι αντισταθμίζεται από GMT. Για να το διορθώσετε αυτό, απλά πολλαπλασιάστε με -1.

Επίσης, σημειώστε ότι w3school λέει:

Η επιστρεφόμενη τιμή δεν είναι σταθερή, λόγω της πρακτικής της χρήσης θερινή ώρα.

Απαντήθηκε 27/11/2009 στις 18:52
πηγή χρήστη

ψήφοι
174

Η πιο δημοφιλής (== πρότυπο;) τον τρόπο προσδιορισμού της ζώνης ώρας που έχω δει γύρω απλώς ζητώντας από τους ίδιους τους χρήστες. Εάν η ιστοσελίδα σας απαιτεί συνδρομή, αυτό θα μπορούσε να σωθεί με τα δεδομένα του προφίλ των χρηστών. Για τους χρήστες Anon, οι ημερομηνίες θα μπορούσε να εμφανίζεται ως UTC ή GMT ή κάποια τέτοια.

Δεν προσπαθώ να είναι μια έξυπνη aleck. Είναι απλά ότι μερικές φορές ορισμένα προβλήματα έχουν λεπτότερα λύσεις έξω από κάθε πλαίσιο προγραμματισμού.

Απαντήθηκε 03/08/2008 στις 20:30
πηγή χρήστη

ψήφοι
77

Δεν υπάρχουν κεφαλίδες HTTP που θα αναφέρει τον πελάτη ζώνη ώρας μέχρι στιγμής, αν και έχει προταθεί να συμπεριληφθεί στην προδιαγραφή HTTP.

Αν ήμουν εγώ, εγώ θα μπορούσε πιθανότατα να προσπαθήσει να φέρει τη ζώνη ώρας χρησιμοποιώντας clientside JavaScript και στη συνέχεια την υποβάλλει στο διακομιστή χρησιμοποιώντας Ajax ή κάτι τέτοιο.

Απαντήθηκε 01/08/2008 στις 13:19
πηγή χρήστη

ψήφοι
47

Η Javascript είναι ο ευκολότερος τρόπος για να πάρετε την τοπική ώρα του πελάτη. Θα ήθελα να προτείνω τη χρήση ενός XMLHttpRequestνα στείλει πίσω την τοπική ώρα, και αν αυτό αποτύχει, πέφτουν πίσω στη ζώνη ώρας ανιχνεύεται με βάση τη διεύθυνση IP τους.

Σε ό, geolocation, έχω χρησιμοποιήσει MaxMind GeoIP σε διάφορα σχέδια και δουλεύει καλά, αν και δεν είμαι σίγουρος αν παρέχουν δεδομένα ζώνης ώρας. Είναι μια υπηρεσία που πληρώνετε για και παρέχουν μηνιαίες ενημερώσεις στη βάση δεδομένων σας. Παρέχουν περιτυλίγματα σε διάφορες γλώσσες web.

Απαντήθηκε 01/08/2008 στις 16:11
πηγή χρήστη

ψήφοι
39

Εδώ είναι μια ισχυρή λύση την Javascript για να καθοριστεί η ζώνη ώρας το πρόγραμμα περιήγησης είναι το.

>>> var timezone = jstz.determine();
>>> timezone.name(); 
"Europe/London"

https://bitbucket.org/pellepim/jstimezonedetect

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

ψήφοι
34

Εδώ είναι ένα πιο ολοκληρωμένο τρόπο.

  1. Πάρτε την ζώνη ώρας μετατόπιση για το χρήστη
  2. Δοκιμάστε μερικές ημέρες για DLS όρια για να καθοριστεί αν είναι σε μια ζώνη που χρησιμοποιεί DLS.

Εκτός από κάτω:

function TimezoneDetect(){
    var dtDate = new Date('1/1/' + (new Date()).getUTCFullYear());
    var intOffset = 10000; //set initial offset high so it is adjusted on the first attempt
    var intMonth;
    var intHoursUtc;
    var intHours;
    var intDaysMultiplyBy;

    //go through each month to find the lowest offset to account for DST
    for (intMonth=0;intMonth < 12;intMonth++){
        //go to the next month
        dtDate.setUTCMonth(dtDate.getUTCMonth() + 1);

        //To ignore daylight saving time look for the lowest offset.
        //Since, during DST, the clock moves forward, it'll be a bigger number.
        if (intOffset > (dtDate.getTimezoneOffset() * (-1))){
            intOffset = (dtDate.getTimezoneOffset() * (-1));
        }
    }

    return intOffset;
}

Να πάρει TZ και DST από JS (μέσω Way Back Machine)

Απαντήθηκε 30/03/2011 στις 21:48
πηγή χρήστη

ψήφοι
26

Χρησιμοποιώντας την προσέγγιση Unkwntech του, έγραψα μια λειτουργία με τη χρήση jQuery και PHP. Αυτό έχει δοκιμαστεί και λειτουργεί!

Στη σελίδα PHP όπου θα θέλετε να έχετε τη ζώνη ώρας ως μεταβλητή, έχουν αυτό το απόσπασμα κώδικα κάπου κοντά στο επάνω μέρος της σελίδας:

<?php    
    session_start();
    $timezone = $_SESSION['time'];
?>

Αυτό θα διαβάσει τη μεταβλητή συνόδου «του χρόνου», που είμαστε τώρα έτοιμοι να δημιουργήσουν.

Στην ίδια σελίδα, στην, θα πρέπει πρώτα απ 'όλα περιλαμβάνουν jQuery:

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>

Επίσης στο, κάτω από το jQuery, επικόλληση αυτό:

<script type="text/javascript">
    $(document).ready(function() {
        if("<?php echo $timezone; ?>".length==0){
            var visitortime = new Date();
            var visitortimezone = "GMT " + -visitortime.getTimezoneOffset()/60;
            $.ajax({
                type: "GET",
                url: "http://domain.com/timezone.php",
                data: 'time='+ visitortimezone,
                success: function(){
                    location.reload();
                }
            });
        }
    });
</script>

Μπορεί να είναι ή να μην έχετε παρατηρήσει, αλλά θα πρέπει να αλλάξει το url για την πραγματική τομέα σας.

Ενα τελευταίο πράγμα. Είστε πιθανόν να αναρωτιέται ποια είναι η timezone.php καλό είναι. Λοιπόν, είναι απλά αυτό: (δημιουργήσετε ένα νέο αρχείο που ονομάζεται timezone.php και το σημείο σε αυτό με το παραπάνω url)

<?php
    session_start();
    $_SESSION['time'] = $_GET['time'];
?>

Εάν λειτουργεί σωστά, θα φορτώσει πρώτα τη σελίδα, να εκτελέσει το JavaScript, και επαναλάβετε τη φόρτωση της σελίδας. Στη συνέχεια, θα είστε σε θέση να διαβάσει το $ ζώνη ώρας μεταβλητή και να το χρησιμοποιήσετε για να σας απόλαυση! Επιστρέφει την τρέχουσα ζώνη ώρας UTC / GMT ώρας (GMT -7) ή ό, τι ζώνη ώρας στην οποία βρίσκεστε.

Απαντήθηκε 09/04/2011 στις 20:16
πηγή χρήστη

ψήφοι
18

Πρώτον, να κατανοήσουν ότι η ανίχνευση ζώνη ώρας σε JavaScript είναι ατελής. Μπορείτε να πάρετε την τοπική ζώνη ώρας για μια συγκεκριμένη ημερομηνία και την ώρα χρησιμοποιώντας getTimezoneOffsetσε μια παρουσία του Dateαντικειμένου, αλλά αυτό δεν είναι ακριβώς το ίδιο με ένα πλήρες IANA ζώνη ώρας όπως America/Los_Angeles.

Υπάρχουν μερικές επιλογές που μπορεί να λειτουργήσει αν:

  • Τα περισσότερα σύγχρονα προγράμματα περιήγησης υποστηρίζουν ζώνες ώρας IANA στην εφαρμογή τους από την API ECMAScript διεθνοποίηση , ώστε να μπορείτε να το κάνετε αυτό:

    const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone;
    

    Το αποτέλεσμα είναι ένα string που περιέχει τη ρύθμιση ζώνης ώρας IANA του υπολογιστή όπου ο κώδικας είναι σε λειτουργία.

    Τα Υποστηριζόμενα περιβάλλοντα που αναφέρονται στον πίνακα Intl συμβατότητα . Αναπτύξτε την DateTimeFormatενότητα, και να εξετάσουμε την δυνατότητα που ονομάζεται resolvedOptions().timeZone defaults to the host environment.

  • Εάν πρέπει να υποστηρίξει ένα ευρύτερο σύνολο περιβάλλοντα, όπως παλαιότερα προγράμματα περιήγησης στο Web, μπορείτε να χρησιμοποιήσετε μια βιβλιοθήκη για να κάνει μια εκπαιδευμένη εικασία κατά τη χρονική ζώνη. Λειτουργούν με πρώτη την προσπάθεια του IntlAPI, εάν είναι διαθέσιμο, και όταν δεν είναι διαθέσιμη, θα ανακρίνουν τον getTimezoneOffsetσυνάρτηση του Dateαντικειμένου, για πολλές διαφορετικές χρονικές στιγμές, χρησιμοποιώντας τα αποτελέσματα για να επιλέξετε την κατάλληλη ζώνη ώρας από ένα εσωτερικό σύνολο δεδομένων.

    Τόσο jsTimezoneDetect και τη στιγμή-ζώνη ώρας έχουν αυτή τη δυνατότητα.

    // using jsTimeZoneDetect
    var tzid = jstz.determine().name();
    
    // using moment-timezone
    var tzid = moment.tz.guess();
    

    Και στις δύο περιπτώσεις, το αποτέλεσμα μπορεί να θεωρηθεί μόνο ως εικασία. Η εικασία μπορεί να είναι σωστό, σε πολλές περιπτώσεις, αλλά δεν είναι όλοι τους.

    Επιπλέον, αυτές οι βιβλιοθήκες πρέπει να ενημερώνεται περιοδικά για να εξουδετερώσει το γεγονός ότι πολλοί ηλικιωμένοι υλοποιήσεις το JavaScript γνωρίζουν μόνο από την τρέχουσα εξοικονόμησης κανόνα ώρα για την τοπική ζώνη ώρας τους το φως της ημέρας. Περισσότερες λεπτομέρειες σχετικά με αυτό εδώ.

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

Υπάρχει επίσης η εντελώς διαφορετική προσέγγιση δεν στηρίζεται στην ρύθμιση ζώνης ώρας του υπολογιστή του χρήστη σε όλα. Αντ 'αυτού, αν μπορείτε να συγκεντρώσετε συντεταγμένες γεωγραφικού πλάτους και μήκους, μπορείτε να επιλύσετε τα σε μια ζώνη ώρας χρησιμοποιώντας μία από αυτές τις μεθόδους . Αυτό λειτουργεί καλά σε κινητές συσκευές.

Απαντήθηκε 25/03/2014 στις 04:47
πηγή χρήστη

ψήφοι
18

Για την υποβολή της ζώνης ώρας αντισταθμίζεται ως κεφαλίδα HTTP για τις αιτήσεις AJAX με jQuery

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        xhr.setRequestHeader("X-TZ-Offset", -new Date().getTimezoneOffset()/60);
    }
});

Μπορείτε επίσης να κάνετε κάτι παρόμοιο για να πάρει τον πραγματικό χρόνο ονομασία της ζώνης με τη χρήση moment.tz.guess();από http://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/

Απαντήθηκε 13/09/2012 στις 03:05
πηγή χρήστη

ψήφοι
18

Ακόμα δεν έχω δει μια λεπτομερή απάντηση εδώ που παίρνει τη ζώνη ώρας. Δεν πρέπει να χρειάζεται να γεωκωδικοποιήσει από τη διεύθυνση IP ή τη χρήση της PHP (lol) ή εσφαλμένα μαντέψει από offset.

Κατ 'αρχάς η ζώνη ώρας δεν είναι μόνο μια μετατόπιση από το GMT. Πρόκειται για μια έκταση γης στην οποία οι κανόνες που ορίζεται από τα τοπικά πρότυπα. Ορισμένες χώρες έχουν θερινή ώρα, και θα στραφούν σε θερινή ώρα σε διαφορετικούς χρόνους. Είναι συνήθως σημαντικό να πάρει την πραγματική ζώνη, όχι μόνο η τρέχουσα offset.

Αν σκοπεύετε να αποθηκεύσετε αυτή τη ζώνη ώρας, για παράδειγμα, στις προτιμήσεις των χρηστών που θέλετε από τη ζώνη και όχι μόνο το offset. Για μετατροπές σε πραγματικό χρόνο δεν θα έχει σημασία πολύ.

Τώρα, για να πάρει τη ζώνη ώρας με javascript μπορείτε να χρησιμοποιήσετε αυτό:

>> new Date().toTimeString();
"15:46:04 GMT+1200 (New Zealand Standard Time)"
//Use some regular expression to extract the time.

Ωστόσο, θα ήταν ευκολότερο να χρησιμοποιήσετε απλά αυτό το ισχυρό plugin που επιστρέφει το Olsen διαμορφωμένη ζώνη ώρας:

https://github.com/scottwater/jquery.detect_timezone

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

ψήφοι
16

Εύκολο, απλά χρησιμοποιήστε το Javascript για getTimezoneOffsetλειτουργία όπως αυτό:

-new Date().getTimezoneOffset()/60;
Απαντήθηκε 27/05/2012 στις 18:25
πηγή χρήστη

ψήφοι
16

Με ημερομηνία PHP λειτουργία θα πάρετε την ώρα ημερομηνία διακομιστή στον οποίο βρίσκεται το site. Ο μόνος τρόπος για να πάρετε το χρόνο χρήστης να χρησιμοποιήσει το JavaScript.

Αλλά εγώ σας προτείνω να, αν το site σας έχουν ζητήσει την καταχώριση τότε καλύτερος τρόπος είναι να ρωτήσετε τον χρήστη, ενώ η καταχώριση ως υποχρεωτικό πεδίο. Μπορείτε να απαριθμήσει διάφορες ζώνες ώρας στην σελίδα μητρώο και να σώσει ότι στη βάση δεδομένων. Μετά από αυτό, αν την είσοδο του χρήστη στο site, στη συνέχεια, μπορείτε να ορίσετε την προεπιλεγμένη ζώνη ώρας για τη σύνοδο αυτή, σύμφωνα με επιλεγμένη ζώνη ώρας των χρηστών. Μπορείτε να ορίσετε οποιαδήποτε συγκεκριμένη ζώνη ώρας χρησιμοποιώντας τη λειτουργία PHP date_default_timezone_set. Αυτό που την καθορισμένη ζώνη ώρας για τους χρήστες.

Βασικά ζώνη ώρας των χρηστών είναι πηγαίνει στην πλευρά του πελάτη, γι 'αυτό πρέπει να χρησιμοποιήσετε τη Javascript για αυτό.

Παρακάτω είναι το σενάριο να πάρει τη ζώνη ώρας των χρηστών χρησιμοποιώντας PHP και JavaScript.

<?php
#http://www.php.net/manual/en/timezones.php List of Time Zones
function showclienttime()
{
  if(!isset($_COOKIE['GMT_bias']))
  {
    ?>
    <script type="text/javascript">
    var Cookies = {};
    Cookies.create = function (name, value, days) {
      if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        var expires = "; expires=" + date.toGMTString();
      } else {
        var expires = "";
      }
      document.cookie = name + "=" + value + expires + "; path=/";
      this[name] = value;
    }

    var now = new Date();
    Cookies.create("GMT_bias",now.getTimezoneOffset(),1);
    window.location = "<?php echo $_SERVER['PHP_SELF'];?>";
    </script>
    <?php
  } else {
    $fct_clientbias = $_COOKIE['GMT_bias'];
  }

  $fct_servertimedata = gettimeofday();
  $fct_servertime = $fct_servertimedata['sec'];
  $fct_serverbias = $fct_servertimedata['minuteswest'];
  $fct_totalbias = $fct_serverbias – $fct_clientbias;
  $fct_totalbias = $fct_totalbias * 60;
  $fct_clienttimestamp = $fct_servertime + $fct_totalbias;
  $fct_time = time();
  $fct_year = strftime("%Y", $fct_clienttimestamp);
  $fct_month = strftime("%B", $fct_clienttimestamp);
  $fct_day = strftime("%d", $fct_clienttimestamp);
  $fct_hour = strftime("%I", $fct_clienttimestamp);
  $fct_minute = strftime("%M", $fct_clienttimestamp);
  $fct_second = strftime("%S", $fct_clienttimestamp);
  $fct_am_pm = strftime("%p", $fct_clienttimestamp);
  echo $fct_day.", ".$fct_month." ".$fct_year." ( ".$fct_hour.":".$fct_minute.":".$fct_second." ".$fct_am_pm." )";
}

showclienttime();
?>

Όμως, σύμφωνα με τη δική μου άποψη, είναι καλύτερα να ρωτήσετε τους χρήστες, αν η εγγραφή είναι υποχρεωτική στο έργο σας.

Απαντήθηκε 16/09/2010 στις 06:59
πηγή χρήστη

ψήφοι
16

Όποιος γνωρίζει από τις υπηρεσίες που θα ταιριάζει IP για τη γεωγραφική θέση

Λοιπόν, τυχεροί για σας ότι η απάντηση μπορεί να βρεθεί σε πολύ δική του ιστοσελίδα Stackoverflow μας: Πώς να πάρει την χώρα, σύμφωνα με μια συγκεκριμένη IP;

αεροτομή: http://www.hostip.info/use.html

Απαντήθηκε 04/08/2008 στις 12:11
πηγή χρήστη

ψήφοι
15

javascript:

function maketimus(timestampz)
{
    var linktime = new Date(timestampz * 1000);
    var linkday = linktime.getDate();
    var freakingmonths=new Array();

    freakingmonths[0]="jan";
    freakingmonths[1]="feb";
    freakingmonths[2]="mar";
    freakingmonths[3]="apr";
    freakingmonths[4]="may";
    freakingmonths[5]="jun";
    freakingmonths[6]="jul";
    freakingmonths[7]="aug";
    freakingmonths[8]="sep";
    freakingmonths[9]="oct";
    freakingmonths[10]="nov";
    freakingmonths[11]="dec";

    var linkmonthnum = linktime.getMonth();
    var linkmonth = freakingmonths[linkmonthnum];
    var linkyear = linktime.getFullYear();
    var linkhour = linktime.getHours();
    var linkminute = linktime.getMinutes();

    if (linkminute < 10)
    {
        linkminute = "0" + linkminute;
    }

    var fomratedtime = linkday + linkmonth + linkyear + " " + linkhour + ":" + linkminute + "h";
    return fomratedtime;
}    

απλά παρέχουν φορές σας σε μορφή UNIX Timestamp σε αυτή τη λειτουργία, javascript γνωρίζει ήδη τη ζώνη ώρας του χρήστη.

σαν αυτό:

php:

echo '<script type="text/javascript">
var eltimio = maketimus('.$unix_timestamp_ofshiz.');
document.write(eltimio);
</script><noscript>pls enable javascript</noscript>';

Αυτό θα δείξει πάντα τους χρόνους σωστά με βάση τη ζώνη ώρας το πρόσωπο που έχει οριστεί για το ρολόι του υπολογιστή του, δεν χρειάζεται να ζητήσετε τίποτα σε κανέναν και να το αποθηκεύσετε σε χώρους δόξα τω Θεώ!

Απαντήθηκε 28/08/2011 στις 00:00
πηγή χρήστη

ψήφοι
14

Μην χρησιμοποιείτε τη διεύθυνση IP για να προσδιορίσει οριστικά την τοποθεσία (και Hense ζώνη ώρας) - αυτό είναι επειδή με το NAT, Proxies (ολοένα και πιο δημοφιλής), και VPNs, οι διευθύνσεις IP δεν πρέπει απαραίτητα να ανταποκρίνονται ρεαλιστικά την πραγματική θέση του χρήστη, αλλά και η θέση στην οποία διακομιστές την εφαρμογή των πρωτοκόλλων αυτά τα κατοικούν.

Παρόμοια με το πώς δεν είναι πλέον χρήσιμο για τον εντοπισμό ενός τηλεφωνικού χρήστη είναι Κωδικοί περιοχής, δεδομένης της δημοτικότητας της Φορητότητας Αριθμών.

IP και άλλες τεχνικές που δείχνεται παραπάνω είναι χρήσιμες για υποδηλώνοντας μια προεπιλεγμένη που ο χρήστης μπορεί να ρυθμίσει / σωστή.

Απαντήθηκε 02/01/2013 στις 19:05
πηγή χρήστη

ψήφοι
14

Η μαγεία όλων φαίνεται να είναι σε

visitortime.getTimezoneOffset()

Αυτό είναι δροσερό, δεν ήξερα γι 'αυτό. Έχει εργαστεί στον IE, κλπ; Από εκεί θα πρέπει να είναι σε θέση να χρησιμοποιούν JS με AJAX, που τα cookies, οτιδήποτε. Είχα πάει πιθανώς την διαδρομή μπισκότο τον εαυτό μου.

Θα πρέπει να επιτρέπει στο χρήστη να το αλλάξετε όμως. Προσπαθήσαμε να χρησιμοποιήσετε geolocation (μέσω MaxMind) για να το κάνετε αυτό πριν από λίγο καιρό, και λάθος ήταν αρκετά συχνά - αρκετά για να κάνουν ότι δεν αξίζει να κάνει, γι 'αυτό ακριβώς επιτρέπουν στο χρήστη να ρυθμίσετε το προφίλ τους, και δείχνουν μια προειδοποίηση προς τους χρήστες που δεν έχουν το δικό τους που ακόμη.

Απαντήθηκε 03/08/2008 στις 21:40
πηγή χρήστη

ψήφοι
11

Ένας απλός τρόπος για να το κάνουμε είναι με τη χρήση:

new Date().getTimezoneOffset();
Απαντήθηκε 01/12/2011 στις 12:08
πηγή χρήστη

ψήφοι
11

Αν τυχαίνει να χρησιμοποιούν το OpenID για τον έλεγχο ταυτότητας, απλή επέκταση Εγγραφή θα λύσει το πρόβλημα για τους πιστοποιημένους χρήστες (Θα χρειαστεί να μετατρέψετε από tz στο αριθμητικό).

Μια άλλη επιλογή θα ήταν να συμπεράνουμε τη ζώνη ώρας από την προτίμηση της χώρας του πράκτορα χρήστη. Αυτή είναι μια κάπως αργό τρόπο (δεν θα λειτουργήσει για en-US), αλλά κάνει μια καλή προσέγγιση.

Απαντήθηκε 30/08/2008 στις 10:29
πηγή χρήστη

ψήφοι
10

Εδώ είναι ένα άρθρο (με τον πηγαίο κώδικα) που εξηγεί πώς να καθορίσει και να χρησιμοποιήσετε τοπική ώρα σε ένα (VB.NET, C #) εφαρμογή ASP.NET:

Καιρός ήταν

Με λίγα λόγια, η προσέγγιση που περιγράφεται βασίζεται στην Javascript για getTimezoneOffsetλειτουργία, η οποία επιστρέφει την τιμή που έχει αποθηκευτεί στο cookie περιόδου και να χρησιμοποιηθούν από τον κωδικό-πίσω για να ρυθμίσετε τις τιμές διάστημα μεταξύ GMT και της τοπικής ώρας. Το ωραίο είναι ότι ο χρήστης δεν χρειάζεται να ορίσετε τη ζώνη ώρας (ο κώδικας κάνει αυτόματα). Δεν υπάρχει μεγαλύτερη συμμετοχή (αυτός είναι ο λόγος που συνδέουν το άρθρο), αλλά υπό τον όρο κώδικα καθιστά πραγματικά εύκολο στη χρήση. Υποψιάζομαι ότι μπορείτε να μετατρέψετε τη λογική σε PHP και άλλες γλώσσες (εφ 'όσον έχετε κατανοήσει ASP.NET).

Απαντήθηκε 25/05/2010 στις 01:11
πηγή χρήστη

ψήφοι
8

Απλά με JSκαι PHP:

Ακόμα κι αν ο χρήστης μπορεί να το χάος με εσωτερικό ρολόι ή / και ζώνης ώρας του, ο καλύτερος τρόπος που βρήκα μέχρι τώρα, να πάρει το offset, παραμένει new Date().getTimezoneOffset();. Μη επεμβατική του, δεν δίνει το κεφάλι τους πόνους και εξαλείφει την ανάγκη να βασίζονται σε τρίτους.

Ας υποθέσουμε ότι έχω έναν πίνακα usersπου περιέχει ένα πεδίο date_created int(13), για την αποθήκευση unix χρονικές σφραγίδες?

Υποθέτοντας έναν πελάτη creates a new account, τα δεδομένα που λαμβάνονται από post, και εγώ πρέπει να insert/updateτο date_created columnμε το Unix timestamp του πελάτη, δεν το διακομιστή.

Δεδομένου ότι η κείμενα σελίδων απαιτείται κατά τη στιγμή της εισαγωγής / ενημέρωσης, έχει περάσει ως ένα επιπλέον στοιχείο $ _POST όταν ο πελάτης υποβάλλει το έντυπο, εξαλείφοντας έτσι την ανάγκη να το αποθηκεύσετε σε συνεδρίες ή / και μπισκότα, και κανένα πρόσθετο εξυπηρετητή χτυπά ούτε.

var off = (-new Date().getTimezoneOffset()/60).toString();//note the '-' in front which makes it return positive for negative offsets and negative for positive offsets
var tzo = off == '0' ? 'GMT' : off.indexOf('-') > -1 ? 'GMT'+off : 'GMT+'+off;

Πείτε ο server λαμβάνει tzoως $_POST['tzo']?

$ts = new DateTime('now', new DateTimeZone($_POST['tzo']);
$user_time = $ts->format("F j, Y, g:i a");//will return the users current time in readable format, regardless of whether date_default_timezone() is set or not.
$user_timestamp = strtotime($user_time);

Εισαγωγή / ενημέρωση date_created=$user_timestamp.

Κατά την ανάκτηση της DATE_CREATED, μπορείτε να μετατρέψετε το timestamp όπως έτσι:

$date_created = //get from db
$created = date("F j, Y, g:i a",$date_created);//return it to the user or whatever

Τώρα, αυτό το παράδειγμα μπορεί να ανταποκριθεί στις ανάγκες ενός ατόμου, όταν πρόκειται για την εισαγωγή μιας firstσήμανσης χρόνου ... Όταν πρόκειται για την επιπλέον χρονική σήμανση, ή τραπέζι, u μπορεί να θέλετε να εξετάσει την εισαγωγή της τιμής tzo στον πίνακα χρήστες για μελλοντική αναφορά, ή με τη ρύθμιση αυτή ως συνεδρία ή ως ένα μπισκότο.

PS Τι γίνεται όμως όταν ο χρήστης κινείται και αλλάζει ζώνες ώρας. Logs σε GMT + 4, ταξιδεύει γρήγορα για να GMT-1 και συνδέεται ξανά. Τελευταία σύνδεση θα είναι στο μέλλον.

Νομίζω ότι ... σκεφτόμαστε πάρα πολύ.

Απαντήθηκε 15/09/2014 στις 02:19
πηγή χρήστη

ψήφοι
7

Δοκιμάστε αυτόν τον κώδικα php

<?php  
$ip = $_SERVER['REMOTE_ADDR'];
$json = file_get_contents("http://api.easyjquery.com/ips/?ip=".$ip."&full=true");
$json = json_decode($json,true);
$timezone = $json['LocalTimeZone'];
?>
Απαντήθηκε 30/07/2012 στις 09:08
πηγή χρήστη

ψήφοι
7

Εδώ είναι πώς το κάνω. Αυτό θα θέσει το PHP προεπιλεγμένη ζώνη ώρας στην τοπική ζώνη ώρας του χρήστη. Απλά επικολλήστε το παρακάτω στην κορυφή του όλες τις σελίδες σας:

<?php
session_start();

if(!isset($_SESSION['timezone']))
{
    if(!isset($_REQUEST['offset']))
    {
    ?>
        <script>
        var d = new Date()
        var offset= -d.getTimezoneOffset()/60;
        location.href = "<?php echo $_SERVER['PHP_SELF']; ?>?offset="+offset;
        </script>
        <?php   
    }
    else
    {
        $zonelist = array('Kwajalein' => -12.00, 'Pacific/Midway' => -11.00, 'Pacific/Honolulu' => -10.00, 'America/Anchorage' => -9.00, 'America/Los_Angeles' => -8.00, 'America/Denver' => -7.00, 'America/Tegucigalpa' => -6.00, 'America/New_York' => -5.00, 'America/Caracas' => -4.30, 'America/Halifax' => -4.00, 'America/St_Johns' => -3.30, 'America/Argentina/Buenos_Aires' => -3.00, 'America/Sao_Paulo' => -3.00, 'Atlantic/South_Georgia' => -2.00, 'Atlantic/Azores' => -1.00, 'Europe/Dublin' => 0, 'Europe/Belgrade' => 1.00, 'Europe/Minsk' => 2.00, 'Asia/Kuwait' => 3.00, 'Asia/Tehran' => 3.30, 'Asia/Muscat' => 4.00, 'Asia/Yekaterinburg' => 5.00, 'Asia/Kolkata' => 5.30, 'Asia/Katmandu' => 5.45, 'Asia/Dhaka' => 6.00, 'Asia/Rangoon' => 6.30, 'Asia/Krasnoyarsk' => 7.00, 'Asia/Brunei' => 8.00, 'Asia/Seoul' => 9.00, 'Australia/Darwin' => 9.30, 'Australia/Canberra' => 10.00, 'Asia/Magadan' => 11.00, 'Pacific/Fiji' => 12.00, 'Pacific/Tongatapu' => 13.00);
        $index = array_keys($zonelist, $_REQUEST['offset']);
        $_SESSION['timezone'] = $index[0];
    }
}

date_default_timezone_set($_SESSION['timezone']);

//rest of your code goes here
?>
Απαντήθηκε 28/01/2012 στις 09:21
πηγή χρήστη

ψήφοι
6

Μια πιθανή λύση είναι να χρησιμοποιήσετε το Dateπεδίο κεφαλίδας, η οποία ορίζεται στο RFC 7231 και υποτίθεται ότι περιλαμβάνουν τη ζώνη ώρας. Φυσικά, δεν υπάρχει εγγύηση ότι η τιμή είναι πολύ ζώνης ώρας του πελάτη, αλλά μπορεί να είναι ένα βολικό σημείο εκκίνησης.

Απαντήθηκε 09/09/2014 στις 00:25
πηγή χρήστη

ψήφοι
5

Να πάρει μια έγκυρη TZ βάση δεδομένων όνομα ζώνη ώρας στην PHP είναι μια διαδικασία δύο σταδίων:

1) Με την Javascript, να τη ζώνη ώρας αντισταθμιστεί μέσα σε λίγα λεπτά μέσα getTimezoneOffset. Αυτή η μετατόπιση θα είναι θετικό εάν η τοπική ώρα είναι πίσω UTC και αρνητικά αν είναι μπροστά. Έτσι, θα πρέπει να προσθέσετε ένα αντίθετο πρόσημο με τη μετατόπιση.

var timezone_offset_minutes = new Date().getTimezoneOffset();
timezone_offset_minutes = timezone_offset_minutes == 0 ? 0 : -timezone_offset_minutes;

Περάστε αυτό αντισταθμίζεται με την PHP.

2) Στην PHP μετατρέψει αυτή αντισταθμίστηκε σε ένα έγκυρο όνομα ζώνη ώρας με timezone_name_from_abbr λειτουργία.

// Just an example.
$timezone_offset_minutes = -360;  // $_GET['timezone_offset_minutes']

// Convert minutes to seconds
$timezone_name = timezone_name_from_abbr("", $timezone_offset_minutes*60, false);

// America/Chicago
echo $timezone_name;

Έχω γράψει μια θέση blog σε αυτό: http://usefulangle.com/post/31/detect-user-browser-timezone-name-in-php Περιέχει ένα demo επίσης.

Απαντήθηκε 10/01/2017 στις 11:56
πηγή χρήστη

ψήφοι
5

θα μπορούσατε να το κάνετε για τον πελάτη με τη στιγμή, τη ζώνη ώρας και στείλτε την αξία στον server? δείγματος χρήσης:

> moment.tz.guess()
"America/Asuncion"
Απαντήθηκε 13/09/2016 στις 06:19
πηγή χρήστη

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