2015-08-03 2 views
6

Мне нужно отправить данные в json. Важно то, что я хочу сохранить локаль, чтобы получатель получал дату в свое местное время. Как я могу это сделать?Как отправить java.util.Date в Json?

Я не могу просто использовать Date.toString(), потому что тогда я не смогу его проанализировать до конца на принимающей стороне, если их язык отличается (разные имена дня и месяца и т. Д.).

Есть ли решение для этого?

ответ

1

Используйте метод getTime java.util.Date для метки времени. Как только вы конвертируете его обратно в дату, каждый приемник может отображать его, используя локальный часовой пояс.

Помните, что Дата

представляет определенный момент во времени, с точностью до миллисекунды.

Метод ToString просто форматирует его в specific way:

dow mon dd hh:mm:ss zzz yyyy 

Chosing отправить метку времени означает, что вы также можете использовать меньшую пропускную способность.

+0

Что происходит, когда Дата, созданная в одном часовом поясе и переданная и потребляемая в другом часовом поясе? – aviad

+0

Дата, созданная в часовом поясе, преобразуется в число миллисекунд с 1 января 1970 года, 00:00:00 по Гринвичу (через getTime), а затем этот номер преобразуется в дату любого часового пояса. –

+0

Это, наверное, то, что я ищу. Сколько времени в миллисекундах? – Greyshack

6

A ms долгое время с 1970 года прекрасное, но не читаемое человеком, и, следовательно, PITA для тестирования/разработки.

Поэтому использовать ISO 8601 стандартного времени даты"yyyy-MM-dd'T'HH:mm:ss" (где 'T' является только буквальным T (один часто видит пространство здесь;. И доли секунды .SSS)

Времени зоны возможно тоже, но мы надеюсь, не требуется (= включен в локализованное время).

Перед использованием Java 8 SimpleDateFormat.

2

Правильный способ сделать это, чтобы написать дату в ISO 8601 Формат: т.е. 2015-08-03T4:50:49+00:00

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

Для отправки части, если вы пишете строку самостоятельно, а просто отформатировать его:

ZonedDateTime.now(ZoneId.systemDefault()) 
      .format(DateTimeFormatter.ISO_DATE_TIME) 

Но если вы используете какие-либо JSON сериализаторы для преобразования из ваших Java-объектов (например, Джексон, например), то просто сделайте атрибут объекта java.util.Date, и сериализатор должен знать, что делать, учитывая правильную настройку. См. this answer для Джексона, или this one для Джерси. Они оба используют Joda Time.

0

Я думаю, что есть простой способ сделать это,

DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
yourJsonObject.accumulate("yourDateVarible",dateFormat.format(new Date())); 
2

Т.Л., д-р

Instant.now() 
     .toString() 

2017-01-23T12: 34: 56.123456789Z

UTC

Gene ралли лучше всего обмениваться данными для значений даты и времени в формате UTC (GMT). Пусть приемник настроится на желаемый часовой пояс.

Instant

Instant класс представляет собой момент на шкале времени в формате UTC с разрешением наносекунд.

Instant instant = Instant.now() ; 
String output = instant.toString() ; // Generate a String in standard ISO 8601 format. 

2017-01-23T12: 34: 56.123456789Z

Вы можете легко разобрать эту строку.

Instant instant = Instant.parse("2017-01-23T12:34:56.123456789Z") ; 

ISO 8601

Стандарт ISO 8601 определяет четкие простые для чтения форматов простых в разборе для текстовых представлений значений даты и времени. Эти форматы идеально подходят для обмена данными.

На данный момент в UTC это означает формат, показанный в примере выше. T отделяет часть даты от части времени суток. Z на конце короткий для Zulu и означает UTC.

Locale

Вопрос упоминает локаль, как будто связанные с часовым поясом. A Locale имеет ничего делать с часовым поясом. A Locale определяет (a) человеческий язык для перевода имени дня, названия месяца и т. Д. И (b) культурных норм, решающих вопросы сокращения, капитализации, пунктуации и т. Д.

Часовой пояс - это история изменений в регионе offset-from-UTC, отслеживание аномалий, вызывающих такие изменения, как Daylight Saving Time (DST).

Поиск переполнения стека, чтобы узнать больше. Это уже было рассмотрено уже много раз. Поиск классов, таких как ZoneId, ZoneOffset, ZonedDateTime, Instant, OffsetDateTime и DateTimeFormatter. Прочитайте Oracle Tutorial в классах java.time.

ZonedDateTime zdt = instant.atZone(ZoneId.of("Pacific/Auckland")) ; 
-1

Попробуйте этот формат: 2017-03-20T00: 00: 00,000 + 0100

+1

Насколько это отличается от других ответов? –

0

Есть много способов сделать это. Один из способов конвертировать дату в миллисекундах, которая не зависит от локали и использовать ее дальше. Другой способ изменить дату в формате utc и использовать его дальше. Если часовой пояс вашего сервера установлен в UTC, java.util.Date будет работать отлично, потому что по умолчанию используется системный часовой пояс при использовании новой даты («некоторая дата»). :

long lastAccessedDate = 110002028250; 
    String myDate = new java.util.Date(lastAccessedDate()).toString(); 

MyDate будет "вт 6 июня 5:30:00 UTC 2017", если системное время зона UTC.

+0

Я не согласен со всеми вашими пунктами. Количество миллисекунд неоднозначно как для [ссылочной даты эпохи] (https://en.wikipedia.org/wiki/Epoch_ (reference_date) #Notable_epoch_dates_in_computing), так и для детализации (дни, целые секунды, миллисекунды, микросекунды, нано) , Нет такого понятия, как «utc format». Часовой пояс по умолчанию для ОС хоста или JVM находится вне контроля программиста и поэтому ненадежен; лучше явно указать свой ожидаемый/желаемый часовой пояс. Неудобный класс «Дата» использует ужасный формат и теперь является устаревшим, вытесненным «java.time.Instant». –

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