Преобразование даты в формате Joda-Time DateTime - ISO 8601 в другой формат даты

В моем приложении Java я использую Joda-Time, чтобы преобразовать введенную пользователем дату пользователя из MM/dd/yyyy в формат ISO 8601, чтобы сохранить ее в DB.

Может кто-нибудь скажет мне, как я могу конвертировать ISO 8601 в формат MM/dd/yyyy с использованием Joda-Time?

Мой код конвертирует дату пользователя в формат даты ISO 8601:

String date1 = "05/05/2013";
DateTimeFormatter parser1 = DateTimeFormat.forPattern("MM/dd/yyyy");
DateTime dateTimeObj1 = DateTime.parse(date1,parser1);
DateTimeFormatter isoDateFormat = ISODateTimeFormat.dateTime();
String isoDateStr = isoDateFormat.print(dateTimeObj1);
System.out.println(isoDateStr);

Ответ 1

Использовать тот же форматир

Вы используете тот же объект DateTimeFormatter для синтаксического анализа как print (визуализировать строку) в Joda-Time 2.3.

Часовой пояс

Обратите внимание, что ваш код не обращался к часовому поясу . В этом случае вы получаете часовой пояс JVM по умолчанию. Не очень хорошая практика.

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

Обратите внимание на вызов withZone при определении формата.

Строки

Имейте в виду, что объекты DateTime не являются строками. Вы можете сгенерировать строковое представление информации о дате, содержащейся внутри DateTime, с помощью:

  • Вызов метода toString в экземпляре DateTime.
    В каждой DateTime есть встроенный ISO 8601 formatter, который автоматически используется методом "toString".
  • Создайте собственный экземпляр DateTimeFormatter.

Оба этих метода генерации строк представлены в приведенном ниже примере кода.

Пример кода

// Usually better to specify a time zone than rely on default.
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Hong_Kong" );
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MM/dd/yyyy" ).withZone( timeZone );

// Parse string into a DateTime. Define the format.
String input = "05/05/2013";
DateTime dateTime = formatter.parseDateTime( input ); // Defaults to first moment of the day.

// Render date-time as an ISO 8601 string. The "toString" method on DateTime defaults to a built-in ISO 8601 formatter.
// A DateTime object is not itself a string. But a DateTime can generate a string by calling its "toString" method.
String iso8601String = dateTime.toString();

// Parse string into a DateTime. Passing to constructor conveniently uses the built-in ISO 8601 parser built into DateTime class.
DateTime dateTime2 = new DateTime( iso8601String, timeZone );

// Render date-time as a string in a particular format.
String output = formatter.print( dateTime2 );

Вместо жесткого кода определенного формата вы можете программировать локализованный формат.

String outputUS = DateTimeFormat.forStyle( "S-" ).withLocale( Locale.US ).print( dateTime2 );
String outputQuébécois = DateTimeFormat.forStyle( "F-" ).withLocale( Locale.CANADA_FRENCH ).print( dateTime2 );

Дамп для консоли...

System.out.println( "dateTime: " + dateTime ); // Implicit call to "toString" method in DateTime class generates a new string using a built-in formatter for ISO 8601 format.
System.out.println( "iso8601String: " + iso8601String );
System.out.println( "dateTime2: " + dateTime2 ); // Another implicit call to "toString" method on DateTime class. Generates a new string in ISO format.
System.out.println( "output: " + output );

При запуске...

dateTime: 2013-05-05T00:00:00.000+08:00
iso8601String: 2013-05-05T00:00:00.000+08:00
dateTime2: 2013-05-05T00:00:00.000+08:00
output: 05/05/2013

Строка не является датой

Не считайте объекты даты и времени как строки.

A DateTime не имеет формата. Этот класс может анализировать строку в формате ISO 8601, чтобы создать экземпляр объекта с датой. Аналогично, DateTimeFormatter может анализировать строку, чтобы создать экземпляр объекта с датой.

Переходя в противоположном направлении, a DateTime имеет реализацию toString, которая генерирует строковое представление значения объектов даты и времени. Аналогично, DateTimeFormatter может генерировать строковое представление значения объектов даты и времени.

Во всех этих случаях представление String полностью отличается от объекта даты и отличается от него.