• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czas UTC do lokalnego.

Object Storage Arubacloud
0 głosów
1,075 wizyt
pytanie zadane 29 lipca 2019 w JavaScript przez Bartłomiej Bolesta Obywatel (1,630 p.)
edycja 29 lipca 2019 przez Bartłomiej Bolesta

Nie mogę się doszukać odpowiedzi jak zmienić czas UTC na lokalny. Coś pomijam. 

Linijka innerTxt[i] = toDateTime(sec_num[i]).toLocaleString(options); niczego nie zmienia. Jeśli sprawdzać sec_num w konwerterze online to dostaje "Jest to równoważne UTC: poniedziałek, 29. lipiec 2019, 17:27:42"
InnerTxt po tej linijce również daje tą samą godzinę (oczywiście chodzi o 2h błędnie do tyłu).

 

var now = new Date();
var utc_timestamp = Date.UTC(now.getUTCFullYear(),now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds())/1000;
var sec_num = [];
for (let i=0; i<countElements; i++){
	diff[i] = timeOn[i] - utc_timestamp;					
}
startTime();
drawLine();

var innerTxt = [];
for (let i=0; i<countElements; i++){
	sec_num[i] = utc_timestamp + diff[i];
	var options = {hour: '2-digit', minutes: '2-digit', seconds: '2-digit', day: 'numeric', month: 'numeric',year: 'numeric'};
	innerTxt[i] = toDateTime(sec_num[i]).toLocaleString(options);
	document.getElementById("queuetime"+i).setAttribute("title", "Koniec o: "+innerTxt[i]);		
};

 

1 odpowiedź

+1 głos
odpowiedź 29 lipca 2019 przez Comandeer Guru (600,810 p.)
Bo to wyświetla jedynie w lokalnym formacie, nie bierze pod uwagę strefy czasowej. Kombinowałbym raczej z https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat – tam można podać,o jaką strefę czasową nam chodzi.

Edit: w sumie widzę, że można też te opcje przekazać do `toLocaleString`. Zatem ustawienie opcji `timeZone` może pomóc.
komentarz 29 lipca 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)
No właśnie wrzuciłem, kombinując dalej:

innerTxt[i] = toDateTime(sec_num[i]).toLocaleString(options, {timeZone:'Europe/Warsaw'});

I to nic nie zmieniło, ale pokombinowałem z innymi strefami i dla innych też błędnie pokazuje o dwie godziny, np. dla Nowego Yorku zamiast 18:00 to 16:00.
komentarz 30 lipca 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)

@Comandeer, Częściowo odkryłem problem, między innymi dzięki linkowi, który dałeś. Zaglądając do mojej funkcji: toDateTime(), było bez Date.UTC. Dodałem

function toDateTime(secs) {
	var t = new Date(Date.UTC(1970, 0, 1));
	//t.setSeconds(secs);
	console.log(t);
	return t;
}

I teraz wciąż podaje czas środkowoeuropejski, ale już standardowy, a nie letni.

Thu Jan 01 1970 01:00:00 GMT+0100 (czas środkowoeuropejski standardowy)

Z Date.UTC powinno podawać czas uniwersalny, a tu taki byk.

komentarz 30 lipca 2019 przez Comandeer Guru (600,810 p.)

Hmm

const date = new Date();
console.log( date, date.toLocaleString( 'pl-PL', { timeZone: 'America/New_York' } ) );

Działa.

komentarz 30 lipca 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)
No nie. Tzn. to co podałeś tak - do wyświetlania aktualnej daty w aktualne strefie czasowej. A ja staram się, wziąć czas UTC do dalszych obliczeń. Twój console.log pokazuje poprawnie:

Tue Jul 30 2019 11:29:23 GMT+0200 (czas środkowoeuropejski letni) "30.07.2019, 05:29:23"

Ale jeśli chcę dodać UTC
const date = new Date(Date.UTC(1970, 0, 1));

Thu Jan 01 1970 01:00:00 GMT+0100 (czas środkowoeuropejski standardowy) "31.12.1969, 19:00:00"

Natomiast, gdy pominę Date.UTC:
const date = new Date(1970, 0, 1);

To już w ogóle magia

Thu Jan 01 1970 00:00:00 GMT+0100 (czas środkowoeuropejski standardowy) "31.12.1969, 18:00:00"

GMT+0100, ale bez dodanej godziny. I już myślałem, że wyniki będą ok, ale gdy wracam do funkcji i włączam .setSeconds(secs) to wynik znów o te 2h błędny.
komentarz 30 lipca 2019 przez Comandeer Guru (600,810 p.)

Podajesz do new Date znacznik czasu, ale konstruktor Date zawsze zwraca czas w lokalnej strefie czasowej. W chwili, gdy przekazujesz ten znacznik czasu do Date, następuje automatyczna konwersja. Musiałbyś użyć metod dla UTC, żeby uzyskać datę w UTC → https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCHours

komentarz 31 lipca 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)

Podajesz do new Date znacznik czasu, ale konstruktor Date zawsze zwraca czas w lokalnej strefie czasowej.

No tak. I dlatego potrzeba rozszerzonego zapisu:

new Date(Date.UTC(1970, 0, 1));
To powinno pokazywać już w UTC, ale tego nie robi (albo coś źle zrozumiałem).

Natomiast metoda z linka nie może być tu użyta, bo wynik nie ma już formatu date, tylko stringa, jak sama nazwa wskazuje toUTCString:

Thu Jan 01 1970 00:00:00 GMT+0100 (czas środkowoeuropejski standardowy)

vs
Wed, 31 Dec 1969 23:00:00 GMT

przez co funkcja setSeconds() nie zadziała. (Uncaught TypeError: t.setSeconds is not a function)

No to próbuję zmienić:

function dateToUTC(date) {
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}

I znowu dostaje w czasie środkowoeuropejskim:

Wed Dec 31 1969 23:00:00 GMT+0100 (czas środkowoeuropejski standardowy)

Więc krzak, bo użycie funkcji setSeconds() da mi teraz błąd o 3 godziny.

Wszystko rozbija się o sam początek, gdzie trzeba stworzyć od razu w UTC na godzinę 00:00:00, co się nie dzieje. Nie da się stworzyć obiektu date w UTC?

komentarz 31 lipca 2019 przez Comandeer Guru (600,810 p.)

To powinno pokazywać już w UTC, ale tego nie robi (albo coś źle zrozumiałem).

Konstruktor Date zawsze zwraca datę w lokalnej strefie czasowej, nie w UTC – bez względu na dane wejściowe. Żeby ustawić datę w UTC, trzeba użyć metod, o których wspomniałem (setUTCDate itd.). 

komentarz 31 lipca 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)

Opis wszędzie mówi co innego:

The Date.UTC() method in JavaScript is used to return the number of milliseconds in a Date object since January 1, 1970, 00:00:00, universal time.

 Żeby ustawić datę w UTC, trzeba użyć metod, o których wspomniałem (setUTCDate itd.). 

Nie znajduję i nie widzę sposobów, aby to miało działać.

komentarz 31 lipca 2019 przez Bartłomiej Bolesta Obywatel (1,630 p.)

@Comandeer, Wynalazłem jak to zrobić.

function createDateAsUTC(date) {
    return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));
}

function toDateTime(secs) {
	var t = createDateAsUTC(new Date(1970, 0, 1));	
	t.setUTCSeconds(secs);
	console.log(t);
	return t;
}

innerTxt[i] = toDateTime(sec_num[i]).toLocaleString(options, {timeZone:'Europe/Warsaw'});	

 

komentarz 31 lipca 2019 przez Comandeer Guru (600,810 p.)

No ale przecież to cały czas piszę… Date.UTC zwraca czas w UTC, ale PRZEKAZUJESZ TEN CZAS DO KONSTRUKTORA Date – i tutaj następuje konwersja. Wszystko, co wchodzi do konstruktora Date, wychodzi w lokalnej strefie czasowej.

Nie znajduję i nie widzę sposobów, aby to miało działać.

Działa:

const date = new Date();

date.setUTCDate( 31 );
date.setUTCMonth( 11 );
date.setUTCFullYear( 2019 );
date.setUTCHours( 10 );
date.setUTCMinutes( 10 );
date.setUTCSeconds( 0 );

console.log( date.toLocaleString( 'pl-PL' ), date.toISOString(), date.toGMTString() );

 

Podobne pytania

0 głosów
1 odpowiedź 460 wizyt
pytanie zadane 20 stycznia 2021 w PHP przez Hardwell Dyskutant (8,980 p.)
0 głosów
1 odpowiedź 110 wizyt
pytanie zadane 18 stycznia 2017 w C i C++ przez mati2762 Mądrala (5,510 p.)
0 głosów
1 odpowiedź 205 wizyt
pytanie zadane 12 listopada 2020 w Rozwój zawodowy, nauka, praca przez tabulator97 Nowicjusz (140 p.)

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...