Объект Java String to Date формата "yyyy-mm-dd HH: mm: ss" - программирование
Подтвердить что ты не робот

Объект 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". Пожалуйста, дайте мне знать, где я ошибаюсь.

Спасибо, Йешвант Кота

4b9b3361

Ответ 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?

  • Java SE 8, Java SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональных возможностей java.time обратно переносится на Java 6 и 7 в ThreeTen-Backport.
  • Android

Проект ThreeTen-Extra расширяет java.time с помощью дополнительных классов. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и больше.