it-swarm-eu.dev

Zobrazení data/času ve formátu národního prostředí uživatele a časového posunu

Chci, aby server v HTML vždy zobrazoval data v UTC, a aby měl JavaScript na klientském serveru, převést jej na lokální časové pásmo uživatele.

Bonus, pokud mohu výstup ve formátu data uživatele.

145
kch

Zdá se, že nejjednodušší způsob, jak začít s datem UTC, je vytvořit nový objekt Date a použít metody setUTC… pro jeho nastavení na datum/čas, který chcete.

Pak budou různé metody toLocale…String poskytovat lokalizovaný výstup.

Příklad:

// This would come from the server.
// Also, this whole block could probably be made into an mktime function.
// All very bare here for quick grasping.
d = new Date();
d.setUTCFullYear(2004);
d.setUTCMonth(1);
d.setUTCDate(29);
d.setUTCHours(2);
d.setUTCMinutes(45);
d.setUTCSeconds(26);

console.log(d);                        // -> Sat Feb 28 2004 23:45:26 GMT-0300 (BRT)
console.log(d.toLocaleString());       // -> Sat Feb 28 23:45:26 2004
console.log(d.toLocaleDateString());   // -> 02/28/2004
console.log(d.toLocaleTimeString());   // -> 23:45:26

Některé odkazy:

148
kch

Pro nové projekty stačí použít moment.js

Tato otázka je dost stará, takže moment.js v té době neexistovala, ale pro nové projekty to hodně zjednodušuje. 

Nejlepší je analyzovat váš datový řetězec z UTC následovně (vytvořte ISO-8601 kompatibilní řetězec na serveru, abyste získali konzistentní výsledky ve všech prohlížečích):

var m = moment("2013-02-08T09:30:26Z");

Nyní stačí použít m ve vaší aplikaci, moment.js výchozí nastavení pro místní časové pásmo pro operace zobrazení. Existují mnoho způsobů formátování hodnot data a času nebo jejich extrahování.

Můžete také formátovat momentový objekt v místním nastavení uživatele, jako je tento:

m.format('LLL') // Returns "February 8 2013 8:30 AM" on en-us

Chcete-li transformovat moment.js objekt na jiné časové pásmo (tj. Ani lokální ani UTC), budete potřebovat rozšíření časové zóny časové pásmo moment.js . Tato stránka má také několik příkladů, je to jednoduché.

61
theDmi

Můžete použít new Date().getTimezoneOffset()/60 pro časové pásmo. Existuje také metoda toLocaleString() pro zobrazení data pomocí národního prostředí uživatele.

Zde je celý seznam: Práce s daty

19
jop

Jakmile budete mít objekt data zkonstruován, zde je úryvek pro konverzi:

Funkce trvá objekt formátu UTC formátovaný formátem.
Budete potřebovat prototyp Date.strftime.

function UTCToLocalTimeString(d, format) {
    if (timeOffsetInHours == null) {
        timeOffsetInHours = (new Date().getTimezoneOffset()/60) * (-1);
    }
    d.setHours(d.getHours() + timeOffsetInHours);

    return d.strftime(format);
}
6
simianarmy

To, co jsem použil v minulých projektech:

var myDate = new Date();
var tzo = (myDate.getTimezoneOffset()/60)*(-1);
//get server date value here, the parseInvariant is from MS Ajax, you would need to do something similar on your own
myDate = new Date.parseInvariant('<%=DataCurrentDate%>', 'yyyyMMdd hh:mm:ss');
myDate.setHours(myDate.getHours() + tzo);
//here you would have to get a handle to your span / div to set.  again, I'm using MS Ajax's $get
var dateSpn = $get('dataDate');
dateSpn.innerHTML = myDate.localeFormat('F');
5
Mark

V JS neexistují žádné jednoduché a křížové platformy pro formátování místního času, mimo konverzi každé vlastnosti, jak je uvedeno výše. 

Zde je rychlý hack používám získat místní RRRR-MM-DD. Všimněte si, že se jedná o hack, protože konečné datum už nebude mít správné časové pásmo (takže musíte ignorovat časové pásmo). Pokud potřebuji něco jiného, ​​používám moment.js. 

var d = new Date();    
d = new Date(d.getTime() - d.getTimezoneOffset() * 60000)
var yyyymmdd = t.toISOString().slice(0,0); 
// 2017-05-09T08:24:26.581Z (but this is not UTC)

D.getTimezoneOffset () vrátí posun časové zóny v minutách a d.getTime () je v ms, tedy x 60,000.

4
Jeremy Chone

Metoda .getTimezoneOffset() hlásí posun v časové zóně v minutách, počítá "západ" od časového pásma GMT/UTC, což má za následek hodnotu posunu, která je negativní na to, na co je běžně zvyklý. (Příklad: čas v New Yorku by měl být +240 minut nebo +4 hodin)

Chcete-li získat normální časový posun v hodinách, musíte použít:

var timeOffsetInHours = -(new Date()).getTimezoneOffset()/60

Důležité detaily:
Všimněte si, že do výsledku se započítává letní čas, takže to, co tato metoda poskytuje, je skutečně time offset - ne skutečný geografický časový rozsah posun.

3
Már Örlygsson

S datem z kódu PHP jsem použil něco takového ..

function getLocalDate(php_date) {
  var dt = new Date(php_date);
  var minutes = dt.getTimezoneOffset();
  dt = new Date(dt.getTime() + minutes*60000);
  return dt;
}

Můžeme to nazvat takhle

var localdateObj = getLocalDate('2015-09-25T02:57:46');
3
hriziya

Odpovědi jsem zatím smíchal a přidal k tomu, protože jsem si musel všechny přečíst a chvíli prozkoumat, aby se zobrazil řetězec s datovým časem z db ve formátu lokálního časového pásma uživatele.

Datetime řetězec pochází z python/Django db ve formátu: 2016-12-05T15: 12: 24.215Z

Nezdá se, že by spolehlivá detekce jazyka prohlížeče v JavaScriptu fungovala ve všech prohlížečích (viz JavaScript pro zjištění jazykových preferencí prohlížeče ), takže ze serveru získám jazyk prohlížeče.

Python/Django: odeslat jazyk prohlížeče požadavku jako parametr kontextu:

language = request.META.get('HTTP_ACCEPT_LANGUAGE')
return render(request, 'cssexy/index.html', { "language": language })

HTML: zapište je do skrytého vstupu:

<input type="hidden" id="browserlanguage" value={{ language }}/>

JavaScript: získejte hodnotu skrytého vstupu, např. en-GB, en-US, q = 0,8, en; q = 0,6/a poté si vezměte první jazyk v seznamu pouze prostřednictvím nahrazení a regulárního výrazu

const browserlanguage = document.getElementById("browserlanguage").value;
var defaultlang = browserlanguage.replace(/(\w{2}\-\w{2}),.*/, "$1");

JavaScript: převést na datetime a formátovat:

var options = { hour: "2-digit", minute: "2-digit" };
var dt = (new Date(str)).toLocaleDateString(defaultlang, options);

Viz: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

Výsledkem je (jazyk prohlížeče je en-gb): 05/12/2016, 14:58

3
Anja

Nejlepší řešení, se kterým jsem se setkal, je vytvořit [time display = "llll" datetime = "UTC TIME" /] tagy a použít javascript (jquery) k analýze a zobrazení ve vztahu k uživateli.

http://momentjs.com/ Moment.js 

dobře se zobrazí čas.

2
Daniel

Můžete použít následující postup, který hlásí posun časové zóny od GMT v minutách: 

new Date().getTimezoneOffset();

Poznámka: - tato funkce vrátí záporné číslo.

2
dave

Chcete-li převést datum na místní datum, použijte metodu toLocaleDateString ().

var date = (new Date(str)).toLocaleDateString(defaultlang, options);

Převést čas na místní čas pomocí metody toLocaleTimeString ().

var time = (new Date(str)).toLocaleTimeString(defaultlang, options);
0
Codemaker

// new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]])
var serverDate = new Date(2018, 5, 30, 19, 13, 15); // just any date that comes from server
var serverDateStr = serverDate.toLocaleString("en-US", {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
})
var userDate = new Date(serverDateStr + " UTC");
var locale = window.navigator.userLanguage || window.navigator.language;

var clientDateStr = userDate.toLocaleString(locale, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric'
});

var clientDateTimeStr = userDate.toLocaleString(locale, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
});

console.log("Server UTC date: " + serverDateStr);
console.log("User's local date: " + clientDateStr);
console.log("User's local date&time: " + clientDateTimeStr);

0
Sergey