Java: SimpleDateFormat - невозможно проанализировать строку с датой нужного формата - PullRequest
1 голос
/ 05 марта 2012

Я пытаюсь проанализировать одну строку в формате yyyy-MM-dd и одну в yyyy-MM-dd HH:mm:ss.Я использую SimpleDateFormat.

Раньше я успешно использовал тот же метод, но теперь что-то идет не так.Я получаю дату в стандартном формате, т.е. Tue Mar 05 00:00:00 GMT+05:30 2012 (для yyyy-MM-dd) и Mon Mar 05 13:01:35 GMT+05:30 2012 (для yyyy-MM-dd HH:mm:ss), где мне нужно, чтобы они были 2012-03-05 и 2012-03-05 13:01:35 соответственно.

Вот что я делаю:

Date today = new Date();
SimpleDateFormat tsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
    today = tsdf.parse(tsdf.format(new Date()));
} catch(Exception e) {
    System.out.println("Error occurred"+ e.getMessage());
}

System.out.println(today);

И

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
    // I recieve a string in this format here (refers to 5 march 2012).
    myDate = sdf.parse('2012-03-05');            
    System.out.println(myDate);
} catch(Exception e) {
    System.out.println("Error occurred "+ e.getMessage());
}

Ответы [ 4 ]

3 голосов
/ 05 марта 2012

Вы не выводите строку, которая является результатом форматирования, вы выводите объект фактической даты. Это всегда будет результатом Date.toString (), который для используемого вами JDK является форматом, который вы видите. Не превращайте отформатированную строку обратно в объект даты, просто распечатайте ее!

SimpleDateFormat tsdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
    String formattedDate = tsdf.format(new Date());
} catch(Exception e) {
    System.out.println("Error occurred"+ e.getMessage());
}

System.out.println(formattedDate);

Вы не можете применить «формат» к объекту java.util.Date для дальнейшего использования. Это просто необработанное количество миллисекунд, и его метод toString всегда будет выводить одно и то же представление. Вы должны преобразовать его в форматированную строку и использовать эту строку.

2 голосов
/ 05 марта 2012
today = tsdf.parse(tsdf.format(new Date()));
System.out.println(today);

Похоже, вы ожидаете, что экземпляр Date получает в формате . Это не относится к делу. Экземпляр Date представляет дату, которая может быть отформатирована"до" строки. Это класс, который просто содержит значение long (что-то вроде «время в миллисекундах»).

Это даст ожидаемый результат:

Date today = new Date();
String formattedDate = tsdf.format(today);
System.println(formattedDate);     // <- we print the string!!
0 голосов
/ 23 июля 2016

java.time

Вы используете старые проблемные классы даты и времени, которые теперь вытесняются классами java.time.

Фреймворк java.time встроен вЯва 8 и позже.Эти классы вытесняют старые проблемные классы даты и времени, такие как java.util.Date, .Calendar и & java.text.SimpleDateFormat.Команда Joda-Time также рекомендует выполнить переход на java.time.

Чтобы узнать больше, ознакомьтесь с Oracle Tutorial .И поищите в Stack Overflow множество примеров и объяснений.

Большая часть функций java.time перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP .

LocalDate

Для значений только по дате используйте класс LocalDate.Ваше входное значение в стандартном формате ISO 8601.Форматы ISO 8601 по умолчанию используются в классах java.time для анализа и генерации строк, представляющих значения даты и времени.Поэтому не нужно указывать шаблон форматирования.

LocalDate localDate = LocalDate.parse( "2012-03-05" );

Чтобы создать такую ​​строку, вызовите toString.

String output = localDate.toString();

LocalDateTime

Для строкитакие как 2012-03-05 12:34:56 у нас есть проблемы.Не указано смещение от UTC или часовой пояс.Таким образом, это не представляет фактический момент на временной шкале, а скорее приблизительное представление о возможных моментах.Этот немоментальный момент представлен в java.time классом LocalDateTime.

Формат вашей строки - это вариант ISO 8601, в то время как каноническая версия имеет T в середине, а не в пробеле.Таким образом, один из вариантов - заменить пробел на T.

LocalDateTime ldt = LocalDateTime.parse( "2012-03-05 12:34:56".replace( " " , "T" );

или определить шаблон.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd hh:mm:ss" );
LocalDateTime ldt = LocalDateTime.parse( "2012-03-05 12:34:56" , formatter );

Избегайте использования таких форматов даты и времени, в которых отсутствуют смещение или часовой пояс.информация, если они действительно предназначены для представления фактических моментов на временной шкале.

ZonedDateTime

Чтобы придать значение этому значению, чтобы определить фактический момент на временной шкале, нам нужно назначить времязона, для которой предназначена дата-время.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );

При вызове toString создается строка в формате, расширяющем стандартный формат ISO 8601, добавляя имя часового пояса в квадратных скобках.

String output = zdt.toString(); // Yields: 2012-03-05T12:34:56-04:00[America/Montreal]

Если вы хотите опустить T, вы можете заменить его пробелом, используя метод String::replace.Или используйте форматтер.Если вы действительно хотите, чтобы в строке, показанной в Вопросе, отсутствовала какая-либо информация о смещении или часовом поясе (вопреки моей рекомендации), используйте тот же форматер, показанный выше.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd hh:mm:ss" );  // Not recommended as it lacks offset/zone info.
String output = zdt.format( formatter );  // Yields: 2012-03-05 12:34:56
0 голосов
/ 05 марта 2012

Если вы хотите отформатировать экземпляр Date, вам не нужно использовать метод parse, вы должны использовать метод format следующим образом:

    Date today = new Date();
    SimpleDateFormat tsdf = new SimpleDateFormat("yyyy-MM-dd");
    try
    {
        System.out.println(tsdf.format(today));
    }
    catch (Exception e)
    {
        System.out.println("Error occurred" + e.getMessage());
    }

parse метод используется для преобразования строки в дату и format метод для форматирования Date экземпляра в строку в указанном формате.

...