Используя момент. js часовой пояс, чтобы получить крайние значения дня в другом часовом поясе (но ответ в UT C) - PullRequest
0 голосов
/ 10 июля 2020

Я хочу вычислить экстремальные значения дня (от полуночи до полуночи) для определенного дня, где этот день представляет собой целое количество дней относительно текущего момента (т.е. относительно Date.now()) ... но для другого часового пояса, чтобы UT C. Но я хочу, чтобы ответ (в полночь) вернулся в UT C время (в миллисекундах, аналогично тому, что вы получаете с Date.now()), чтобы я мог передать их в API, который ожидает UT C раз, чтобы получить точный временной диапазон данных. Я попытался использовать момент. js часовой пояс , но ужасно застрял ... Я нашел этот ответ , но он не работает в другом часовом поясе.

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

Я предлагаю вам рассмотреть возможность использования Luxon , который по сути является заменой на данный момент. js.

Алгоритм создает дату на данный момент в требуемом репрезентативном месте, вычтите необходимое количество дней, затем установите начало дня, затем получите значение времени, например,

let DateTime = luxon.DateTime;

// Create date for 00:00:00 3 days ago in Denver
let d = DateTime.local()                   // Create a date
                .setZone('America/Denver') // Set to Denver
                .minus({days:3})           // Subtract 3 days
                .startOf('day');           // Set to start of day
// Create date for end of day
let e = d.endOf('day');

// Denver 3 days ago at start and end of day
console.log('Start of day: ' + d.toISO() + '\nTime value  : ' + d.ts);
console.log('End   of day: ' + e.toISO() + '\ntime value  : ' + e.ts);
<script src="https://cdn.jsdelivr.net/npm/luxon@1.24.1/build/global/luxon.min.js"></script>

Обратите внимание, что 3 дня go в Денвере могут отличаться от 3 дней go в хост-системе из-за различий смещения. Например, в Сиднее, Австралия, в 9 часов утра 20 июля в Денвере будет 5 часов вечера 19 июля, поэтому вычитая 3 дня в Сиднее, получится 17 июля, а в Денвере - 16 июля.

1 голос
/ 10 июля 2020

Moment позволит вам сделать это довольно легко:

function getUTCMidnightMillis(timezone, days_ago) {
  return moment()               // Current time.
    .tz(timezone)               // Convert to desired timezone.
    .subtract(days_ago, 'days') // Go back x days.
    .startOf('day')             // Get start of day, aka Midnight!
    .utc()                      // Convert value into UTC.
    .valueOf()                  // Return milliseconds since unix epoch.
}

console.log("Midnight in Denver:", getUTCMidnightMillis("America/Denver", 0))
console.log("Midnight in New York:", getUTCMidnightMillis("America/New_York", 0))

Что дает результат:

Midnight in Denver: 1594274400000
Midnight in New York: 1594267200000

И действительно, вы можете убедиться, что это правильно:

new Date(1594274400000).toISOString()
// Produces: "2020-07-09T06:00:00.000Z"

9 июля 2020 года мы наблюдаем переход на летнее время в Денвере, поэтому смещение нашего UT C составляет -6 часов. Таким образом, указанная выше отметка времени (6:00 утра UT C) - это тот же момент, когда в Денвере полночь.

...