Umówię się, aby znaleźć początek faktoringu w czasach czasowych w JavaScript. Rozważ następujące:

   var raw_time = new Date(this.created_at);
   var offset_time = new Date(raw_hour.getTime() + time_zone_offset_in_ms);

   // This resets timezone to server timezone
   var offset_day = new Date(offset_time.setHours(0,0,0,0))
   // always returns 2011-12-08 05:00:00 UTC, no matter what the offset was!

   // This has the same issue:
   var another_approach_offset_day = new Date(offset_time.getFullYear(),offset_time.getMonth(),offset_time.getHours())

Spodziewam się, kiedy przekazuję offset Pacific streetzone, aby uzyskać: 2011-12-08 08:00:00 UTC i tak dalej.

Jaki jest właściwy sposób, aby to osiągnąć?

Myślę, że ta część problemu jest to, że Sethours Metoda ustawia godzinę (od 0 do 23 ), zgodnie z czasem lokalnym.

Należy również pamiętać, że używam JavaScript w Mongo, więc nie mogę używać żadnych dodatkowych bibliotek.

Dzięki!


Jeez, więc było to dla mnie naprawdę trudne, ale oto ostateczne rozwiązanie, które wymyśliłem następujące rozwiązanie. Sztuką była, że muszę użyć Sethaurs lub SetuShaurs, aby uzyskać początek dnia - jedynymi wyborami, które mam czas systemowy i UTC. Więc dostaję początek dnia UTC, a następnie dodaj ponownie przesunięcie!

// Goal is given a time and a timezone, find the beginning of day
function(timestamp,selected_timezone_offset) {
  var raw_time = new Date(timestamp)
  var offset_time = new Date(raw_time.getTime() + selected_timezone_offset);
  offset_time.setUTCHours(0,0,0,0);
  var beginning_of_day = new Date(offset_time.getTime() - selected_timezone_offset);
  return beginning_of_day;
}
1
Jonathan 10 grudzień 2011, 00:42

4 odpowiedzi

Najlepsza odpowiedź

W JavaScript wszystkie daty są przechowywane jako UTC. Oznacza to, że numer seryjny zwrócony przez date.valueOf() jest liczbą milisekund od 1970-01-01 00:00:00 UTC. Ale gdy zbadasz datę za pomocą .toString() lub .getHours() itd, otrzymasz wartość w czasie lokalnym. Oznacza to, że lokalny czas systemu działa skrypt. Możesz uzyskać wartość w UTC z metodami takimi jak .toUTCString() lub .getUTCHours() itp.

Więc możesz nie może uzyskać datę w dowolnym czasie czasowym, to wszystko UTC (lub lokalne). Ale oczywiście można uzyskać reprezentację ciągów w dowolnym czasie, jeśli chcesz, jeśli znasz offset UTC. Najłatwiej byłoby odejść przesunięcia UTC od daty i połączenia .getUTCHours() lub .toUTCString() lub cokolwiek potrzebujesz:

var d = new Date();
d.setMinutes(d.getMinutes() - 480); // get pacific standard time
d.toUTCString(); // returns "Fri, 9 Dec 2011 12:56:53 UTC"

Oczywiście musisz zignorować ten "UTC" na końcu, jeśli używasz .toUTCString(). Możesz po prostu iść:

d.toUTCString().replace(/UTC$/, "PST");

Edytuj: Nie martw się, gdy czasowe zachodzą na czas okładki daty. Jeśli przekazujesz setHours() negatywną liczbę, odejmuje te godziny od północy wczoraj. Na przykład:

var d = new Date(2011, 11, 10, 15); // d represents Dec 10, 2011 at 3pm local time
d.setHours(-1);                     // d represents Dec 9, 2011 at 11pm local time
d.setHours(-24);                    // d represents Dec 8, 2011 at 12am local time
d.setHours(52);                     // d represents Dec 10, 2011 at 4am local time
5
gilly3 10 grudzień 2011, 04:05

Gdzie jest zmienna o zmienna Time_Zone_offset_ms? Być może jest to niewiarygodne i powinieneś używać metody daty GettimeZoneoffset (). Jest przykład w następującym adresie URL:

http://www.w3schools.com/jsref/jsref_gettimeZoneoffset.asp.

0
Dexygen 9 grudzień 2011, 21:00

Jeśli znasz datę z innego ciągu daty, możesz wykonać następujące czynności:

var currentDate = new Date(this.$picker.data('date'));
var today = new Date();
today.setHours(0, -currentDate.getTimezoneOffset(), 0, 0);

(Na podstawie zestawu kodu dla projektu, które zrobiłem)

0
Guido Bouman 10 sierpień 2015, 08:40
var aDate = new Date();
var startOfTheDay = new Date(aDate.getTime() - aDate.getTime() % 86400000)

Stworzy początek dnia, dnia danego dnia

0
David 9 marzec 2016, 16:25