Проблемы с датой Java - PullRequest
       15

Проблемы с датой Java

2 голосов
/ 02 февраля 2010

У меня проблема с датой Java, когда я передаю дату до 1949 года в метод ниже. Дата, которую я возвратил, например 2049, я знаю, что это имеет отношение к формату даты, и думал, что использование yyyy вместо RRRR исправило бы это. Но я просто не понимаю, почему или как это восстановить. Любая помощь будет высоко ценится

public static java.sql.Date parseDate(String date) throws ParseException {
  if (date != null) {
   SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");
   return new java.sql.Date(dateFormat.parse(date).getTime());
  }
  return null;
 }

Спасибо, Джон

Ответы [ 2 ]

2 голосов
/ 02 февраля 2010

позвольте мне отформатировать это для вас ..

public static java.sql.Date parseDate(String date) throws ParseException {
    if (date != null) { 
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy"); 
        return new java.sql.Date(dateFormat.parse(date).getTime()); 
    } 
    return null; 
}

Я подозреваю, это то, что вы хотите ...

private Date convertDate() throws ParseException
{
    String dateStr = "21-02-2010";
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
    Date date = null;
    if (dateStr != null)
    {
      date = new Date(dateFormat.parse(dateStr).getTime());
    }

    System.out.println(date);
    return date;
}

За 21-02-2010 вы получите ... Вс 21 февраля 00:00:00 по Гринвичу 2010

За 21-02-1938 вы получите ... Пн Фев 21 00:00:00 GMT 1938

Это помогает? Возможно, из-за того, что в вашем коде есть МММ.

0 голосов
/ 28 марта 2017

ТЛ; др

java.sql.Date.valueOf( 
    LocalDate.parse( "12-Jan-23" , DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US ) ) 
)

Часовой пояс

Ваш код игнорирует критическую проблему часового пояса. Для определения даты требуется часовой пояс. В любой момент времени дата меняется по всему земному шару в зависимости от зоны.

Ваш код использует Date, который всегда в UTC. Таким образом, ваше значение даты, полученное из класса Date с неверным названием, будет точным для UTC, но недействительным для других часовых поясов, таких как America/Montreal или Asia/Kolkata.

Использование java.time

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

Класс LocalDate представляет значение только для даты без времени суток и без часового пояса.

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

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US );
LocalDate localDate = LocalDate.parse( "12-Jan-2017" , f );

В JDBC 4.2 и более поздних версиях LocalDate можно напрямую передавать в базу данных с помощью методов setObject и getObject.

Если драйвер JDBC еще не обновлен, используйте типы java.sql.

java.sql.Date sqlDate = java.sql.Date.valueOf( localDate );
LocalDate localDate = sqlDate.toLocalDate();

О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Где получить классы java.time?

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...