Ответ 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 полностью отличается от объекта даты и отличается от него.