Объект Java String to Date формата "yyyy-mm-dd HH: mm: ss"
Мне нужно преобразовать строку, содержащую дату, в объект даты. Строка будет иметь формат "yyyy-mm-dd HH: mm: ss.SSSSSS", и я хочу иметь тот же формат в объекте даты.
Например, у меня есть строка "2012-07-10 14: 58: 00.000000", и мне нужен результирующий объект даты того же формата.
Я пробовал следующие методы, но результат не так, как ожидалось.
java.util.Date temp = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss.SSSSSS").parse("2012-07-10 14:58:00.000000");
DateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
Date thisDate = dateFormat.parse("2012-07-10 14:58:00.000000");
В результате "Tue Jan 10 14:58:00 EST 2012". Пожалуйста, дайте мне знать, где я ошибаюсь.
Спасибо,
Йешвант Кота
Ответы
Ответ 1
java.util.Date temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").parse("2012-07-10 14:58:00.000000");
mm
- минуты, которые вы хотите mm
КОД
public class Test {
public static void main(String[] args) throws ParseException {
java.util.Date temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS")
.parse("2012-07-10 14:58:00.000000");
System.out.println(temp);
}
}
Отпечатки:
Вт 10 июля 14:58:00 EDT 2012
Ответ 2
Для справок в будущем:
yyyy => 4 digit year
MM => 2 digit month (you must type MM in ALL CAPS)
dd => 2 digit "day of the month"
HH => 2-digit "hour in day" (0 to 23)
mm => 2-digit minute (you must type mm in lowercase)
ss => 2-digit seconds
SSS => milliseconds
Итак, "yyyy-MM-dd HH: mm: ss" возвращает "2018-01-05 09:49:32"
Но "MMM dd, yyyy hh: mm a" возвращает "Январь 05, 2018 09:49 утра"
Так называемые примеры в https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html показывают только вывод. Они не говорят вам, какие форматы использовать!
Ответ 3
TL;DR
LocalDateTime.parse(
"2012-07-10 14:58:00.000000".replace( " " , "T" )
)
Микросекунды не подходят
Вы пытаетесь сжать значение с микросекундами (шесть десятичных цифр) в тип данных, способный только к разрешению в миллисекундах (три десятичных разряда). Это невозможно.
Вместо этого используйте тип данных с достаточно большим разрешением. Классы java.time используют наносекундное разрешение (девять десятичных цифр).
Неизолированный вход не соответствует зонированному типу
Вы пытаетесь поместить значение, не имеющее никакого смещения-от-UTC или часового пояса, в тип данных (Date
), который представляет только значения в формате UTC. Таким образом, вы добавляете информацию (UTC offset), не предназначенную для ввода.
Вместо этого используйте соответствующий тип данных. В частности, java.time.LocalDateTime
.
чувствительны к регистру
Другие ответы и комментарии правильно объясняют, что коды шаблонов форматирования чувствительны к регистру. Таким образом, MM
и MM
имеют разные эффекты.
Избегать устаревших классов
Неудобные старые классы времени, связанные с самыми ранними версиями Java, теперь являются устаревшими, вытесняются классами java.time, встроенными в Java 8 и более поздние версии.
ISO 8601
Ваши входные строки почти соответствуют стандартным форматам ISO 8601. Замените SPACE посередине на T
, чтобы полностью соответствовать.
Классы java.time используют стандартные форматы по умолчанию при разборе/генерации строк. Поэтому нет необходимости указывать шаблон форматирования.
Объекты с датой не имеют "формат"
и мне нужен результирующий объект даты того же формата.
Нет, объекты даты и времени не имеют "формат". Не объединяйте объекты с датой с помощью простых строк. Строки - это входы и выходы объектов. Объекты сохраняют свои собственные внутренние представления информации о дате и времени, детали которых не имеют отношения к нам как вызывающие программисты.
java.time
В вашем входе отсутствует какой-либо индикатор смещения-от-UTC или тревожная зона. Поэтому мы анализируем как объекты LocalDateTime
, которым не хватает этих понятий.
String input = "2012-07-10 14:58:00.000000".replace( " " , "T" ) ;
LocalDateTime ldt = LocalDateTime.parse( input ) ;
Генерация строк
Чтобы создать строку, представляющую значение вашего LocalDateTime
:
- Вызовите
toString
, чтобы получить строку в стандартном формате ISO 8601.
- Используйте
DateTimeFormatter
для создания строк в пользовательских форматах или автоматически-локализованных форматах.
Поиск для получения дополнительной информации, поскольку эти темы были рассмотрены много раз.
ZonedDateTime
A LocalDateTime
не представляет точную точку на временной шкале.
Чтобы определить фактический момент, назначьте часовой пояс. Например, полдень в Калькутте Индия прибывает намного раньше, чем полдень в Париже. Полдень без часового пояса может происходить в любой точке в течение примерно 26-27 часов.
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
О java.time
Структура java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь режим обслуживания, советуем перейти к классам java.time.
Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация JSR 310.
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time с помощью дополнительных классов. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и больше.