Есть ли функция для получения даты UTC в формате строки языка? - PullRequest
2 голосов
/ 30 марта 2019

Я хочу получить текущую дату UTC в JavaScript, но отображать ее в локальном формате даты (как Date.toLocaleDateString() делает).

Сначала я попытался получить текущую дату UTC с помощью Date.toUTCString(), но на самом деле это не выводится в локальном формате.

Затем я попытался использовать конфигурацию параметров в toLocaleDateString(), но это просто напечатало локальную дату, а не дату UTC в локальном формате.например, new Date().toLocaleDateString(options = {timeZone: "UTC"})

Затем я попытался отформатировать, используя Intl.DateTimeFormat(), но это просто дает те же результаты, что и Date.toLocaleDateString().

Если был способ получить формат локали, тоЯ был бы рад использовать этот формат для форматирования даты UTC, но, насколько я могу судить, ее нет.

Например, учитывая new Date("Sat, 30 Mar 2019 00:27:19 GMT"), в США я должен распечатать »30.03.2009 ", в Европе я должен распечатать" 30/3/2019 "и т. Д. Для каждой поддерживаемой локали.

Тем не менее, new Date("Sat, 30 Mar 2019 00:27:19 GMT").toLocaleDateString(options = {timeZone: "UTC"}) вместо этого выведет «29.03.2009».

Ответы [ 3 ]

2 голосов
/ 08 апреля 2019

Я также хотел отобразить дату с использованием настроек локализованной строки, как toLocaleDateString(), но с использованием значения даты в формате UTC вместо местного часового пояса.

Например:

Localized UTC date problem

Мне нужен формат локализованной строки, но я также хочу значение UTC вместо значения местного часового пояса.В этом примере желаемым выводом будет 4/3/2019 вместо 4/2/2019.


Я принял предложение @AndersonHappens, но не использовал его.Вот что я сделал вместо этого:

Существует функция getTimezoneOffset(), которая обеспечивает смещение местного часового пояса.

Мы можемиспользуйте результат этой функции и создайте новый Date, применяя diff.Затем мы можем использовать toLocaleDateString() напрямую, как обычно, чтобы получить дату в формате локализованной строки:

Localized UTC date solution

Решение как функция может бытькак это:

function toLocaleUTCDateString(date, locales, options) {
    const timeDiff = date.getTimezoneOffset() * 60000;
    const adjustedDate = new Date(date.valueOf() + timeDiff);
    return adjustedDate.toLocaleDateString(locales, options);
}
2 голосов
/ 30 марта 2019

Учитывая дату, вы можете получить формат локали с новым Intl.DateTimeFormat (). Затем вы можете использовать formatToParts, чтобы получить форматирование даты и каждого конкретного компонента.

Следуя примеру в документации formatToParts , я создал следующий метод для получения даты UTC в строке локали.

function toLocaleUTCDateString(date) {
  let formatter = new Intl.DateTimeFormat();
  return formatter.formatToParts(date).map(({type, value}) => { 
    switch (type) {
      case 'day': return date.getUTCDate();
      case 'hour': return date.getUTCHours();
      case 'minute': return date.getUTCMinutes();
      case 'month': return date.getUTCMonth() + 1;
      case 'second': return date.getUTCSeconds();
      case 'timeZoneName': return "UTC";
      case 'year': return date.getUTCFullYear();
      default : return value; 
    } 
  }).reduce((string, part) => string + part);
}

Заметьте, однако, что этот метод не запоминает число по сравнению с форматированием строки. Например, если вы хотите, чтобы месяц марта отображался как «март» (или строка месяца на определенном языке), а не как число 3, вам придется выяснить, как это сделать самостоятельно. Он также не обрабатывает расхождения в будние дни, поэтому если локальной датой является «Пятница», а датой UTC является «Суббота», вам также придется выяснить это отдельно.

0 голосов
/ 30 марта 2019

toLocaleString получает некоторые параметры, первый параметр - локаль. Чтобы конкретно решить вашу проблему, вы должны понимать, что UTC не является локалью. То, что вы могли бы сделать, чтобы достичь того, что вы хотите, это передать либо «en-US» для 3/29/2019, либо «en-GB» для 29/03/2019 надеюсь, что это поможет!

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