Как я могу получить "Стандартную" строку часового пояса от объекта момента? - PullRequest
1 голос
/ 02 апреля 2019

Я работаю над проектом asp.net, выполняю различные операции с датами и временем между базой данных на сервере и виджетами, отображающими их на клиенте.Я пытаюсь использовать moment.js.

Когда я отлаживаю свой моментный объект, я вижу следующую информацию:

SampleData

Мне нужноиспользовать часть «Pacific Daylight Time», так как это единственный формат строки, принятый классом TimeZoneInfo c # (который я использую в бэкэнде).

Как получить этот фрагмент данных?

Я прочитал документы и руководства, и нет ничего, связанного со "стандартными" названиями часовых поясов, только с городскими, такими как "Америка / Лос-Анджелес", что не подходит.Я мог бы создать словарь, сопоставляющий названия городов со стандартными названиями, но это заняло бы много времени и было бы мучительно, поэтому я хотел бы найти правильный способ сделать это.

1 Ответ

1 голос
/ 02 апреля 2019

Использовать разбор строк или библиотеку C #

Я нашел 2 решения, которые дали мне нужные данные, но оба довольно ужасные и хакерские.

  1. На внешнем интерфейсе вызовите функцию .toString() и момент совпадения результата, чтобы получить только имя часового пояса.

Это можно сделать с помощью регулярных выражений или .split(), и это работает, предполагая, что формат строки даты никогда не изменяется. Это может выглядеть так:

var timeZoneName = momentDate._d.toString().split("(")[1].split(")")[0];
//timeZoneName now holds "Pacific Daylight Time"

После передачи этого значения в серверную часть вам все равно нужно заменить «Дневной свет» на «Стандартный», чтобы создать экземпляр TimeZoneInfo.

  1. На сервере используйте внешнюю библиотеку для сопоставления.

Две библиотеки, которые я нашел, были TimeZoneNames и TimeZoneConverter . Они могут принимать имена в стиле IANA и сопоставлять их с аналогами Windows Standard. Я использовал TimeZoneConverter как:

localTZName = TZConvert.IanaToWindows(tzName);
TimeZoneInfo localTimeZone = TimeZoneInfo.FindSystemTimeZoneById(localTZName);

tzName был результатом использования moment.tz.guess() на внешнем интерфейсе. Этот метод работал очень хорошо, но он представляет собой предварительно созданный эквивалент создания карты из одного стиля в другой, поэтому я рад, что кто-то еще прошел через эту боль, поэтому мне не пришлось.

Оба эти решения ужасны, но, похоже, их не обойти

Первое решение основывается на надежде, что строковое представление момента никогда не изменится, и у момента действительно должен быть способ получить этот конкретный фрагмент данных без необходимости вырезать его из строки, тем более что они уже пытались найти данные , они просто не позволяют вам их получить.

Второе решение - это просто перебор. Невыразительный, некрасивый, но он работает, хотя на самом деле такое ощущение, что он должен быть чем-то родным для элемента moment.tz.js, TimeZoneInfo или, предпочтительно, для обоих.

Кажется, что разъединение происходит из-за того, что moment.js отказывается признавать существование Windows, в то время как Windows отказывается признавать, что часовые пояса - сложные звери с большой историей, которые могут влиять на точное датирование.

...