Hoe krijg ik de exacte lokale tijd van de klant?

Wat is de beste methode om de lokale tijd van de klant te krijgen, ongeacht de tijdzone van het systeem van de klant? Ik ben een applicatie aan het maken en ik moet eerst de exacte tijd en datum krijgen van de plaats waar de client toegang heeft. Zelfs het detecteren van het IP-adres van het clientsysteem heeft een nadeel of het detecteren van de tijdzone van het clientsysteem kan soms riskant zijn. Dus, is er een uitweg die echt betrouwbaar zou kunnen zijn en niet kwetsbaar voor fouten, omdat het heel gênant is om de verkeerde tijd en datum aan de klant te tonen.


Antwoord 1, autoriteit 100%

In JavaScript? Maak gewoon een nieuw Date-object

var now = new Date();

Hiermee wordt een nieuw Date-object gemaakt met de lokale tijd van de klant.


Antwoord 2, autoriteit 55%

Tegenwoordig kun je de juiste tijdzone krijgen van een gebruiker met slechts één regel code:

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

bron: https://developer. mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/resolvedOptions

Je kunt dan moment-timezonegebruiken om tijdzones te ontleden zoals:

const currentTime = moment().tz(timezone).format();

Antwoord 3, autoriteit 23%

Probeer

let s= new Date().toLocaleString();
console.log(s);

Snippet uitvouwen


Antwoord 4, autoriteit 16%

Als je de tijdzone van de klant wilt weten ten opzichte van GMT/UTC, klik dan hier:

var d = new Date();
var tz = d.toString().split("GMT")[1].split(" (")[0]; // timezone, i.e. -0700

Als je de echte naam van de tijdzone wilt, kun je dit proberen:

var d = new Date();
var tz = d.toString().split("GMT")[1]; // timezone, i.e. -0700 (Pacific Daylight Time)

UPDATE 1

Volgens de eerste opmerking van u kunt u ook d.getTimezoneOffset()gebruiken om de verschuiving in minuten van UTC te krijgen. Er zijn echter een paar problemen mee.

  1. Het teken (+/-) van de geretourneerde minuten is waarschijnlijk het tegenovergestelde van wat je zou verwachten. Als je 8 uur achterUTC bent, wordt 480geretourneerd en niet -480. Zie MDNof MSDNvoor meer documentatie.
  2. Het geeft niet echt terug in welke tijdzone de client meldt dat het zich bevindt, zoals in het tweede voorbeeld dat ik gaf. Alleen de minuten die momenteel worden verschoven van UTC. Het zal dus veranderen op basis van zomertijd.

UPDATE 2

Hoewel de voorbeelden van het splitsen van tekenreeksen werken, kunnen ze verwarrend zijn om te lezen. Hier is een regex-versie die gemakkelijker te begrijpen zou moeten zijn en waarschijnlijk sneller is (beide methoden zijn echter erg snel).

Als je de tijdzone van de klant wilt weten ten opzichte van GMT/UTC, klik dan hier:

var gmtRe = /GMT([\-\+]?\d{4})/; // Look for GMT, + or - (optionally), and 4 characters of digits (\d)
var d = new Date().toString();
var tz = gmtRe.exec(d)[1]; // timezone, i.e. -0700

Als je de echte naam van de tijdzone wilt, probeer dan dit:

var tzRe = /\(([\w\s]+)\)/; // Look for "(", any words (\w) or spaces (\s), and ")"
var d = new Date().toString();
var tz = tzRe.exec(d)[1]; // timezone, i.e. "Pacific Daylight Time"

Antwoord 5, autoriteit 10%

Om de lokale tijd in puur Javascript te krijgen
gebruik deze ingebouwde functie

// return new Date().toLocaleTimeString();

Zie onderstaand voorbeeld

function getLocaltime(){
   return new Date().toLocaleTimeString();
 }
 console.log(getLocaltime());

Antwoord 6, autoriteit 5%

Ik moest dit gewoon oplossen, dus ik dacht dat ik mijn antwoord zou achterlaten. jQuery niet vereist Ik heb het element geüpdatet omdat ik het object al in de cache had staan.

Ik heb eerst een php-functie geschreven om de vereiste datums/tijden terug te sturen naar mijn HTML-sjabloon

/**
 * Gets the current location time based on timezone
 * @return string
 */
function get_the_local_time($timezone) {
    //$timezone ='Europe/London';
    $date = new DateTime('now', new DateTimeZone($timezone));
    return array(
        'local-machine-time' => $date->format('Y-m-d\TH:i:s+0000'),
        'local-time' => $date->format('h:i a')
    );
}

Dit wordt vervolgens in mijn HTML-sjabloon gebruikt om een ​​initiële tijd weer te geven en om de door javascript vereiste datumnotatie in een data-attribuut weer te geven.

       <span class="box--location__time" data-time="<?php echo $time['local-machine-time']; ?>">
            <?php  echo $time['local-time']; ?>
        </span>

Vervolgens gebruikte ik de getUTCHours op mijn date-object om de tijd te retourneren, ongeacht de tijdzone van de gebruiker

De methode getUTCHours() retourneert het uur (van 0 tot 23) van de
gespecificeerde datum en tijd, volgens universele tijd.

var initClocks = function() {
    var $clocks = $('.box--location__time');
    function formatTime(hours, minutes) {
        if (hours === 0) {
            hours = 12;
        }
        if (hours < 10) {
            hours = "0" + hours;
        }
        if (minutes < 10) {
            minutes = "0" + minutes;
        }
        return {
            hours: hours,
            minutes: minutes
        }
    }
    function displayTime(time, $clockDiv) {
        var currentTime = new Date(time);
        var hours = currentTime.getUTCHours();
        var minutes = currentTime.getUTCMinutes();
        var seconds = currentTime.getUTCSeconds();
        var initSeconds = seconds;
        var displayTime = formatTime(hours, minutes);
        $clockDiv.html(displayTime.hours + ":" + displayTime.minutes + ":" + seconds);
        setInterval(function() {
            if (initSeconds > 60) {
                initSeconds = 1;
            } else {
                initSeconds++;
            }
            currentTime.setSeconds(initSeconds);
            hours = currentTime.getUTCHours();
            minutes = currentTime.getUTCMinutes();
            seconds = currentTime.getUTCSeconds();
            displayTime = formatTime(hours, minutes);
            $clockDiv.html(displayTime.hours + ":" + displayTime.minutes + ":" + seconds);
        }, 1000);
    }
    $clocks.each(function() {
        displayTime($(this).data('time'), $(this));
    });
};

Vervolgens gebruik ik de setSeconds-methode om het datumobject bij te werken op basis van het aantal seconden sinds het laden van de pagina (eenvoudige intervalfunctie) en de HTML bij te werken


Antwoord 7, autoriteit 3%

  • direct dit leuk vinden:

    new Date((new Date().setHours(new Date().getHours() - (new Date().getTimezoneOffset() / 60)))).toISOString()
    
  • meer details in deze hulpprogramma-functie

    function getLocaLTime() {
      // new Date().getTimezoneOffset() : getTimezoneOffset in minutes 
      //for GMT + 1 it is (-60) 
      //for GMT + 2 it is (-120) 
      //..
      let time_zone_offset_in_hours = new Date().getTimezoneOffset() / 60;
      //get current datetime hour
      let current_hour = new Date().getHours();
      //adjust current date hour 
      let local_datetime_in_milliseconds = new Date().setHours(current_hour - time_zone_offset_in_hours);
      //format date in milliseconds to ISO String
      let local_datetime = new Date(local_datetime_in_milliseconds).toISOString();
      return local_datetime;
      }
    

Antwoord 8, autoriteit 2%

De meest betrouwbare manier die ik heb gevonden om de lokale tijd van een stad of locatie weer te geven, is door gebruik te maken van een Time Zone API zoals Google Time Zone API. Het geeft de juiste tijdzone terug, en nog belangrijker, de zomertijd-offset van elke locatie, wat voor zover ik weet niet kan worden gedaan door alleen het object Date() van JavaScript te gebruiken. Er is een goede tutorial over het gebruik van de API om de lokale tijd hier:

var loc = '35.731252, 139.730291' // Tokyo expressed as lat,lng tuple
var targetDate = new Date() // Current date/time of user computer
var timestamp = targetDate.getTime() / 1000 + targetDate.getTimezoneOffset() * 60 // Current UTC date/time expressed as seconds since midnight, January 1, 1970 UTC
var apikey = 'YOUR_TIMEZONE_API_KEY_HERE'
var apicall = 'https://maps.googleapis.com/maps/api/timezone/json?location=' + loc + '&timestamp=' + timestamp + '&key=' + apikey
var xhr = new XMLHttpRequest() // create new XMLHttpRequest2 object
xhr.open('GET', apicall) // open GET request
xhr.onload = function() {
  if (xhr.status === 200) { // if Ajax request successful
    var output = JSON.parse(xhr.responseText) // convert returned JSON string to JSON object
    console.log(output.status) // log API return status for debugging purposes
    if (output.status == 'OK') { // if API reports everything was returned successfully
      var offsets = output.dstOffset * 1000 + output.rawOffset * 1000 // get DST and time zone offsets in milliseconds
      var localdate = new Date(timestamp * 1000 + offsets) // Date object containing current time of Tokyo (timestamp + dstOffset + rawOffset)
      console.log(localdate.toLocaleString()) // Display current Tokyo date and time
    }
  } else {
    alert('Request failed.  Returned status of ' + xhr.status)
  }
}
xhr.send() // send request

Van: De lokale tijd van elke stad weergeven JavaScript en Google Time Zone API gebruiken


Antwoord 9, autoriteit 2%

Hier is een versie die goed werkt in september 2020 met fetch en https://worldtimeapi.org/api

fetch("https://worldtimeapi.org/api/ip")
  .then(response => response.json())
  .then(data => console.log(data.dst,data.datetime));

Snippet uitvouwen


Antwoord 10, autoriteit 2%

Ik vond deze functie erg handig tijdens al mijn projecten. je kunt het ook gebruiken.

getStartTime(){
    let date = new Date();
    var tz = date.toString().split("GMT")[1].split(" (")[0];
    tz = tz.substring(1,5);
    let hOffset = parseInt(tz[0]+tz[1]);
    let mOffset = parseInt(tz[2]+tz[3]);
    let offset = date.getTimezoneOffset() * 60 * 1000;
    let localTime = date.getTime();
    let utcTime = localTime + offset;
    let austratia_brisbane = utcTime + (3600000 * hOffset) + (60000 * mOffset);
    let customDate = new Date(austratia_brisbane);
    let data = {
        day: customDate.getDate(),
        month: customDate.getMonth() + 1,
        year: customDate.getFullYear(),
        hour: customDate.getHours(),
        min: customDate.getMinutes(),
        second: customDate.getSeconds(),
        raw: customDate,
        stringDate: customDate.toString()
    }
    return data;
  }

dit geeft je de tijd afhankelijk van je tijdzone.

Bedankt.


Antwoord 11, autoriteit 2%

Ik moest de server de lokale tijd melden dat er iets op de client gebeurde. (In deze specifieke businesscase biedt UTC geen waarde). Ik moest toIsoString() gebruiken om het formaat compatibel te hebben met .Net MVC, maar toIsoString() dit converteert het altijd naar UTC-tijd (die naar de server werd verzonden).

Geïnspireerd door het ‘amit saini’-antwoord gebruik ik dit nu

   function toIsoStringInLocalTime(date) {
        return new Date((date.getTime() + (-date.getTimezoneOffset() * 60000))).toISOString()
    }

Antwoord 12

Je kunt ook je eigen nodeJS-eindpunt maken, het publiceren met zoiets als heroku en het openen

require("http").createServer(function (q,r) {
    r.setHeader("accees-control-allow-origin","*")
    r.end(Date.now())
}).listen(process.env.PORT || 80)

Toegang dan gewoon op JS

fetch ("http://someGerokuApp")
.then(r=>r.text)
. then (r=>console.log(r))

Dit is nog steeds relatief ten opzichte van de computer waarop de node-app wordt gehost, maar misschien kunt u op de een of andere manier de locatie achterhalen en verschillende eindpunten opgeven die passen bij de andere tijdzones op basis van de huidige (bijvoorbeeld als de server zich in Californië bevindt voeg dan voor een New Yorkse tijdzone 1000*60*60*3milliseconden toe aan Date.now() om 3 uur toe te voegen)

Voor de eenvoud, als het mogelijk is om de locatie van de server te krijgen en deze als antwoordheader te verzenden, kunt u gewoon de berekeningen doen voor de verschillende tijdzones aan de clientzijde

Met heroku kun je zelfs een regio specificeren die moet worden geïmplementeerd op https://devcenter.heroku.com/articles/regions#specifying-a-regionu kunt dit als referentie gebruiken..

BEWERKEN
realiseerde me net dat de tijdzone in de datumreeks zelf zit, kan gewoon het hele ding betalen als een koptekst om door de klant te worden gelezen

require("http").createServer(function (q,r) {
    var d= new Date()
    r.setHeader("accees-control-allow-origin","*")
    r.setHeader("zman", d.toString())
    r.end(d.getTime())
}).listen(process.env.PORT || 80)

Antwoord 13

mijn code is

function display_c(){
  var refresh=1000; // Refresh rate in milli seconds
  mytime=setTimeout('display_ct()',refresh)
}
  function display_ct() {
  var strcount
  var x = new Date()
  document.getElementById('ct').innerHTML = x;
  tt=display_c();
}
<body onload=display_ct();>
  <span id='ct' ></span>
</body>

Snippet uitvouwen


Antwoord 14

Probeer het op deze manier

   function timenow(){
    var now= new Date(), 
    ampm= 'am', 
    h= now.getHours(), 
    m= now.getMinutes(), 
    s= now.getSeconds();
    if(h>= 12){
        if(h>12) h -= 12;
        ampm= 'pm';
    }
    if(m<10) m= '0'+m;
    if(s<10) s= '0'+s;
    return now.toLocaleDateString()+ ' ' + h + ':' + m + ':' + s + ' ' + ampm;
}
toLocaleDateString()

is een functie om de datum-tijdnotatie te wijzigen, zoals toLocaleDateString("en-us")


Antwoord 15

new Date(Date.now() + (-1*new Date().getTimezoneOffset()*60000)).toISOString()

Other episodes