Упрощенный формат не разбирает миллисекунды

1
String dateTimePattern = "yyyy-MM-dd HH:mm:ss.SSS";
SimpleDateFormat sdf = new SimpleDateFormat(dateTimePattern);
Date startTime = sdf.parse("2014-03-14 04:16:58.666");
System.out.println(startTime);

Вывод

Fri Mar 14 04:16:58 CDT 2014

Почему не печатает миллисекунды?

  • 1
    Это потому, что вы печатаете с использованием реализации .toString() Date по умолчанию; если вы хотите другой формат, повторно используйте SimpleDateFormat которого есть метод для форматирования Date в String
  • 0
    Date является контейнером миллисекунд, начиная с эпохи Unix, у него нет понятия формата (помимо того, что предоставляет текущий локальный), вы не можете изменить это, это работа DateFormatter. Прекращение попытки поменять форму на дату будет продолжать расстраивать вас.
Теги:
simpledateformat

3 ответа

3
Лучший ответ

Проблема здесь не в том, что миллисекунды не обрабатываются, ваш startTime включает миллисекунды, которые вы предоставили. Проблема в том, что они не печатаются.

Вам нужно отформатировать свой вывод, если вы хотите, чтобы что-то отличное от формата по умолчанию от Date#toString():

Преобразует этот объект Date в String формы: dow mon dd hh: mm: ss zzz yyyy

Вы можете использовать свой SimpleDateFormat для форматирования вывода, который даст вам миллисекунды:

System.out.println(sdf.format(startTime));
  • 0
    Я хочу, чтобы вернуть в формате даты
  • 0
    У вас уже есть это в startTime , это просто влияет на вывод.
Показать ещё 1 комментарий
3

Вы напрямую печатаете startTime (например, toString() из java.util.Date); если вы хотите, чтобы ваш результат соответствовал указанному вами дате DateFormat, который вы могли бы сделать -

 String dateTimePattern = "yyyy-MM-dd HH:mm:ss.SSS";
 SimpleDateFormat sdf = new SimpleDateFormat(dateTimePattern);
 Date startTime = sdf.parse("2014-03-14 04:16:58.666");
 System.out.println(sdf.format(startTime)); // <-- use the DateFormat.

Что будет выводить

2014-03-14 04:16:58.666
  • 0
    Я хочу, чтобы вернуть в формате даты
  • 0
    даже если sdf.parse не печатает вывод в миллисекундах при возврате данных в базу данных, он показывает там миллисекунды.
1

Другие ответы верны.

Избегайте juDate

У вас был бы более простой код и ни одна из этих путаниц, если бы вы использовали Joda-Time (или пакет java.time в Java 8), а не печально известные классы java.util.Date &.Calendar & java.text.SimpleDateFormat в комплекте с Java.

Joda времени

Joda-Time имеет встроенные автоматические парсеры для форматов ISO 8601. Ваш формат будет работать, если вы замените это пространство на T

Пример кода с использованием Joda-Time 2.3...

String inputRaw = ( "2014-03-14 04:16:58.666" );
String input = inputRaw.replace( " ", "T" );

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime dateTime = new DateTime( input, timeZone );

DateTime dateTimeUtc = dateTime.withZone( DateTimeZone.UTC );

Сбросить консоль...

System.out.println( "input: " + input );
System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTimeUtc: " + dateTimeUtc );

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

input: 2014-03-14T04:16:58.666
dateTime: 2014-03-14T04:16:58.666+01:00
dateTimeUtc: 2014-03-14T03:16:58.666Z

Ещё вопросы

Сообщество Overcoder
Наверх
Меню