2015-12-02 6 views
2

У меня есть служба Java, которая должна возвращать информацию о дате/времени, которая отформатирована относительно текущего часового пояса пользователя (C#). Например, скажем, пользователь находится на западном побережье (мирное время), где он находится в 8:00 вечера. Они подключаются к службе, которая размещается на Среднем Западе (центральное время), где она находится в 10:00 вечера. Если пользователь должен был запросить сервер на текущее время, сервер должен ответить «8:00 вечера» для пользователя.Создайте java.util.Date из C# System.TimeZone

Моя мысль заключается в том, что клиентское приложение (C#) передаст информацию службе о ее текущем часовом поясе или смещении UTC. Затем Java будет создавать/форматировать все даты с использованием этого часового пояса.

Однако у меня возникли проблемы с поиском хорошего способа передать информацию C# System.TimeZone таким образом, что Java может создавать и использовать объект java.util.TimeZone. Я могу получить смещение UTC от C#, но не трехзначный код часового пояса. В Java я могу создать TimeZone из трехзначного кода, но не могу найти способ создать его из смещения UTC. Из всего, что я видел в Java, TimeZones создаются с кодом («PST») или страной/регионом («Америка/Лос-Анджелес»), и я не верю, что есть четкий способ получить часовой пояс в этом формате в C#.

Как это можно сделать?

+0

Можете ли вы общаться с UTC и форматировать на клиенте? –

+0

К сожалению, нет. В этом случае представление для клиента создается/отображается на сервере. – trebor

ответ

0

Работа в UTC

Как комментарий предложил, как правило, лучший способ пойти на работу бизнес-логики в UTC. Отрегулируйте в локальный часовой пояс только для представления, если ожидается от пользователя.

Таким образом, ваш Java-сервер должен возвращать значение времени времени UTC. Обычно лучший способ сделать это - сериализовать значение даты в виде строки в стандартном формате ISO 8601. Затем пусть клиентское приложение обрабатывает презентацию, создавая строковое представление значения даты и времени, скорректированного в определенный часовой пояс.

См. this Question о лучших практиках работы с датой.

Но как-то это невозможно в контексте этого Вопроса. Таким образом, клиентское приложение должно сообщать бэкэнд желаемый/ожидаемый часовой пояс.

часового пояса

Избегайте 3-4 буквенные коды, такие как EST или IST. Эти коды не являются ни стандартизированными, ни уникальными. Кроме того, они сбивают с толку летнее время.

Вместо этого используйте official time zone names. Они в основном представлены в формате «континент», «слэш» и «регион/город» на английском языке, например America/Montreal или Asia/Kolkata.

.Net не поддержит часовой пояс Именование

К сожалению, похоже, что команда .Net не знает о правильном именовании часового пояса.

Категория System.TimeZone предлагает такие объекты, как StandardName. Но примеры в докторе показывают «Тихоокеанское стандартное время», а не собственное имя, например «Америка/Лос-Анджелесе».

Нода Время

Мое первое предложение рассмотреть вопрос об использовании проекта Noda Time, альтернативную дату и время API для .NET.Это было вдохновлено очень успешной библиотекой Joda-Time на Java, которая, в свою очередь, вдохновила новую инфраструктуру java.time, встроенную в Java 8 и более поздние версии.

Похоже, у Noda Time есть поддержка правильных часовых поясов. Вместо использования System.TimeZone используйте Noda Time для получения информации о часовом поясе.

Ролл своего собственного Mapping

Если Нод время не вариант, то я мог бы посмотреть, чтобы увидеть, если мои пользователи находятся в нескольких часовых поясах. Если это так, я бы сделал свое собственное отображение, такое как «Pacific Daylight Time», возвращаемое C# стандартным именем для часового пояса, являющимся собственным именем «America/Los_Angeles».

Смежные вопросы