Шаблон 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')'



Еще раз спасибо всем!

745   4  

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 ) 
)

Генерирующая строка.

myJavaUtilDate.toInstant()
              .atZone( ZoneId.of( "America/New_York" ) )
              .format( 
                  DateTimeFormatter.ofPattern ( "EEE MMM dd uuuu HH:mm:ss 'GMT'Z (z)" )
                                   .withLocale ( Locale.US ) 
              )
[27]}Java.время

Вы используете проблемные старые классы даты и времени, теперь унаследованные, вытесненные 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 );

ЗДТ.toString (): 2016-03-30T00: 00-04: 00[America / New_York]

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

Укажите собственное имя часового пояса в формате 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

Проект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

    Ничего не найдено.