Как получить начало дня даты в javascript - с учетом часового пояса - PullRequest
1 голос
/ 10 декабря 2011

Я изо всех сил пытаюсь узнать начало дня с учетом часовых поясов в javascript. Учтите следующее:

   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())

Я ожидаю, когда я передам смещение часового пояса Тихого океана, получу: 2011-12-08 08:00:00 UTC и т. Д.

Как правильно этого добиться?

Я думаю, что отчасти проблема в том, что метод setHours устанавливает час (от 0 до 23) в соответствии с местным временем.

Также обратите внимание, что я использую javascript, встроенный в mongo, поэтому я не могу использовать какие-либо дополнительные библиотеки.

Спасибо!


Боже, это было очень сложно для меня, но вот окончательное решение, в котором я нашел следующее решение. Хитрость заключалась в том, что мне нужно было использовать setHours или SetUTCHours, чтобы получить начало дня - единственные варианты, которые у меня есть, - это системное время и UTC. Итак, я получаю начало дня UTC, затем добавляю обратно смещение!

// 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;
}

Ответы [ 4 ]

5 голосов
/ 10 декабря 2011

В JavaScript все даты хранятся как UTC. То есть серийный номер, возвращаемый date.valueOf(), представляет собой количество миллисекунд с 1970-01-01 00:00:00 UTC. Но когда вы проверяете дату через .toString() или .getHours() и т. Д., Вы получаете значение по местному времени. То есть местное время системы, в которой выполняется скрипт. Вы можете получить значение в UTC с помощью таких методов, как .toUTCString() или .getUTCHours() и т. Д.

Итак, вы не можете получить дату в произвольном часовом поясе, все это в формате UTC (или локально). Но, конечно, вы можете получить строковое представление даты в любом часовом поясе, который вам нравится, если вы знаете смещение UTC. Самый простой способ - вычесть смещение UTC из даты и позвонить .getUTCHours() или .toUTCString() или как вам нужно:

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

Конечно, вам нужно игнорировать этот «UTC» в конце, если вы используете .toUTCString(). Вы можете просто пойти:

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

Редактировать: Не беспокойтесь о том, когда часовые пояса перекрывают границы дат. Если вы передадите setHours() отрицательное число, оно вычтет эти часы с полуночи вчерашнего дня. Например:

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
0 голосов
/ 09 марта 2016
var aDate = new Date();
var startOfTheDay = new Date(aDate.getTime() - aDate.getTime() % 86400000)

Создает начало дня, рассматриваемого дня

0 голосов
/ 10 августа 2015

Если вы знаете дату из другой строки даты, вы можете сделать следующее:

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

(на основе кодовой базы для проекта, который я сделал)

0 голосов
/ 10 декабря 2011

Откуда берется используемая вами переменная time_zone_offset_in_ms? Возможно, это ненадежно, и вам следует использовать метод getTimezoneOffset () от Date. Вот пример по следующему URL:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...