Шаблон Java SimpleDateFormat для JavaScript Date
Мне нужно преобразовать объект даты Java в строку, которая имеет тот же формат, что и даты JavaScript, когда они преобразуются в строку. На нашем сервере у нас есть JavaScript даты, которые являются .toString() ' d и имеют формат, как:
Wed Mar 30 2016 00:00:00 GMT-0400 (EDT)
И у меня есть объект Java Date, который я пытаюсь преобразовать в строку того же формата. До сих пор мой SimpleDateFormat шаблон
EEE MMM dd yyyy '00:00:00' (часы, минуты и секунды всегда будут равны 0), но я не могу найти правильный шаблон для часового пояса (GMT-0400 (EDT))
Спасибо за помощь! Вот код Java, который я использую до сих пор, если это поможет:
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd yyyy '00:00:00'");
Date date = arrayOfDates[i];
String dateStr = format.format(date);
// Current dateStr = "Wed Mar 30 2016 00:00:00"
EDIT
Ответ Вайбхава Джайна поставил меня на правильный путь (Java SimpleDateFormat Pattern for JavaScript Date )
Окончательный формат, который я использовал, это:
EEE MMM dd yyyy '00:00:00' 'GMT'Z '('z')'
Еще раз спасибо всем!
4 ответов:
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd yyyy '00:00:00' zZ"); Date date = arrayOfDates[i]; String dateStr = format.format(date);
Tl; dr
Синтаксический анализ строки.
ZonedDateTime.parse ( "Wed Mar 30 2016 00:00:00 GMT-0400 (EDT)" , DateTimeFormatter.ofPattern ( "EEE MMM dd uuuu HH:mm:ss 'GMT'Z (z)" ).withLocale ( Locale.US ) )Генерирующая строка.
[27]}Java.времяmyJavaUtilDate.toInstant() .atZone( ZoneId.of( "America/New_York" ) ) .format( DateTimeFormatter.ofPattern ( "EEE MMM dd uuuu HH:mm:ss 'GMT'Z (z)" ) .withLocale ( Locale.US ) )Вы используете проблемные старые классы даты и времени, теперь унаследованные, вытесненные java.время занятий.
Разбор строк
Определите шаблон форматирования с помощью
Современные коды паттернов похожи на устаревшие кодыDateTimeFormatterкласс.SimpleDateFormat, но не совсем идентичны. Изучите документацию. Тонкости зоны / смещения коды шаблонов ускользают от меня, но некоторые проб и ошибок нашли комбинацию, которая, кажется, работает. Проверьте тщательно, как я не сделал; используйте на свой страх и риск.String input = "Wed Mar 30 2016 00:00:00 GMT-0400 (EDT)"; // EDT DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd uuuu HH:mm:ss 'GMT'x (z)" ).withLocale ( Locale.US ); ZonedDateTime zdt = ZonedDateTime.parse ( input , f );Создайте строку в стандартном форматеISO 8601 .
System.out.println ( "zdt.toString(): " + zdt );Кстати, если это вообще возможно, я предлагаю вам использовать стандартные форматы ISO 8601, а не формат, показанный в вашем вопросе. Гораздо проще разобрать и легче прочитать по люди разных культур.ЗДТ.toString (): 2016-03-30T00: 00-04: 00[America / New_York]
Укажите собственное имя часового пояса в формате
continent/region, напримерAmerica/Montreal,Africa/Casablanca, илиPacific/Auckland. никогда не используйте аббревиатуру из 3-4 букв , такую какESTилиEDTилиIST, поскольку они не являются истинными часовыми поясами, не стандартизированы и даже не уникальны(!).Генерация строк
Преобразует любой
Для преобразования обратите внимание на новые методы, добавленные к старым классам.java.util.Dateв его современный эквивалент,Instant. Тот самыйInstantкласс представляет собой момент на временная шкала в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).Instant instant = myJavaUtilDate.toInstant() ;Установите нужный часовой пояс.
ZoneId z = ZoneId.of( "America/New_York" ); ZonedDateTime zdt = instant.atZone( z );Создайте строку, используя тот же объект
DateTimeFormatter, что и выше.DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd uuuu HH:mm:ss 'GMT'x (z)" ).withLocale ( Locale.US ); String output = zdt.format( f );Живой код
Этот пример код живете в IdeOne.com.
String input = "Wed Mar 30 2016 00:00:00 GMT-0400 (EDT)"; // EDT DateTimeFormatter f = DateTimeFormatter.ofPattern ( "EEE MMM dd uuuu HH:mm:ss 'GMT'Z (z)" ).withLocale ( Locale.US ); ZonedDateTime zdt = ZonedDateTime.parse ( input , f ); String output = zdt.format ( f ); System.out.println ( "input: " + input ); System.out.println ( "zdt.toString(): " + zdt ); System.out.println ( "output: " + output ); System.out.println ( "input equals output: " + input.equals ( output ) );Ввод: Ср 30 марта 2016 00: 00: 00 GMT-0400 (EDT)
ЗДТ.toString (): 2016-03-30T00: 00-04: 00[America / New_York]
Выходные данные: Ср 30 марта 2016 00: 00: 00 GMT-0400 (EDT)
Вход равен выходу: true
О Яве.время
The java.фреймворк time встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойные старые унаследованные классы даты и времени, такие как
java.util.Date,Calendar, &SimpleDateFormat.В Joda времени проекта, теперь в режим обслуживания, советует миграции Ява.время занятий.
Чтобы узнать больше, смотрите учебник Oracle. И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310.
Где получить java.время занятий?
- Java SE 8 и еще SE 9 а потом ...
- встроенный.
- часть стандартный Java API со встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и еще SE 7
- большая часть java.функциональность time обратно портирована на Java 6 и 7 в ThreeTen-Backport.
- Android
- ThreeTenABP проект адаптируется ThreeTen-Backport (упомянутый выше) специально для Android.
- см. как использовать ThreeTenABP....
ПроектThreeTen-Extra расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к java.время. Вы можете найти здесь некоторые полезные классы, такие как
Interval,YearWeek,YearQuarter, и еще.
Чтобы отформатировать дату точно так же, нам может понадобиться отформатировать дату и часовой пояс отдельно, например:
SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd yyyy hh:mm:ss"); Date date = new Date(); String dateStr = format.format(date); TimeZone tz = TimeZone.getDefault(); int offset = tz.getRawOffset(); String text = String.format("%s%02d%02d", offset >= 0 ? "+" : "-", offset / 3600000, (offset / 60000) % 60); String timeZoneText = "GMT" + text + " (" + tz.getDisplayName(true, tz.SHORT, Locale.getDefault())+")"; System.out.println(dateStr + " " + timeZoneText);
Как правило, если заданная дата допустима, то созданный объект date должен возвращать обратно то же значение даты, месяца и года. Ниже логика работала для большинства случаев, которые я кодировал.
Пример: 29-Feb-2018 не существует, но когда javascript принимает этот ввод в качестве даты("2018-02-29"), он создает значение даты 1-Mar-2018.
Функция Javascript:
function dateCheck(dd,mm,yyyy) { var tempDt = new Date(parseInt(yyyy), parseInt(mm)-1, parseInt(dd), 0, 0, 0, 0); if(tempDt.getDate()!=parseInt(dd) || tempDt.getFullYear()!=parseInt(yyyy) || tempDt.getMonth() + 1 !=parseInt(mm)) return false; else return true; }
Comments