Подтвердить что ты не робот

Не устаревший точный эквивалент Date (String s) в Java?

У меня есть старый код, который использует new Date(dateString) для синтаксического анализа строки даты. Компиляция кода вызывает предупреждение о сохранении Date(java.lang.String) in java.util.Date has been deprecated.

javadoc бесполезно советует мне использовать DateFormat.parse(), хотя класс DateFormat не имеет статического метода parse.

Теперь я знаю, как использовать SimpleDateFormat, но я хочу удостовериться, что получаю точное поведение от деформированного конструктора Date.

4b9b3361

Ответ 1

Здесь моя догадка (я опубликовал как сообщество wiki, чтобы вы могли проголосовать, если я прав):

Date parsed;
try {
    SimpleDateFormat format =
        new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
    parsed = format.parse(dateString);
}
catch(ParseException pe) {
    throw new IllegalArgumentException(pe);
}

Ответ 2

SimpleDateFormat - это путь. Могу ли я указать, однако, что вам может потребоваться определить один экземпляр SimpleDateFormat и создать объекты Date, используя это. Если вы это сделаете, остерегайтесь того, что SimpleDateFormat не является потокобезопасным, и вы можете подвергать себя некоторым потенциально трудно отлаживающим проблемам!

Я бы рекомендовал воспользоваться этой возможностью, чтобы посмотреть Joda, который является гораздо более продуманным (и потокобезопасным) API, Он является основой JSR-310, который является новым предлагаемым Java Date API.

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

Ответ 3

Если вы посмотрите на источник метода Date.parse(String s), который упоминает Николя, вы увидите, что будет сложно или невозможно построить формат даты, который точно воспроизводит поведение.

Если вы просто хотите исключить предупреждение, вы можете поместить @SuppressWarnings({"deprecation"}) вне метода, вызывающего конструктор Date (String).

Если вы действительно хотите обеспечить будущий доступ к этому поведению с будущими JRE, вы можете просто извлечь этот метод из источников JDK и поместить его в свои собственные источники. Это потребует тщательного изучения лицензий на исходный код и рассмотрения их приложения в вашем конкретном проекте и может быть недопустимо вообще.

Ответ 4

DateFormat имеет статические методы, возвращающие экземпляры DateFormat. Я не знаю, какой из них (если есть) имеет такое же поведение, как Date(String s), но здесь вы идете:

DateFormat.getInstance()
DateFormat.getDateInstance()
DateFormat.getTimeInstance()
DateFormat.getDateTimeInstance()

Ответ 5

Короткий ответ (до дальнейшего расследования): нет, он не эквивалентен. конструктор Date (String toParse) эквивалентен методу синтаксиса класса Date (который также устарел)... И javadoc этот метод утверждает:

Обратите внимание, что это немного отличается от интерпретации лет менее 100, которая используется в SimpleDateFormat.

Если это единственное изменение, я думаю, вы можете продолжить этот путь.

Ответ 6

ТЛ; др

ZonedDateTime.format( 
    input , 
    DateTimeFormatter.ofPattern( 
        "EEE MMM dd HH:mm:ss zzz uuuu" , 
        Locale.ENGLISH 
    ) 
)

java.time

DateFormat классы Date и DateFormat были вытеснены несколько лет назад современными классами java.time с принятием JSR 310.

(java.lang.String) rel="nofollow noreferrer">Конструктор, на который вы ссылаетесь, на самом деле вызывает статический метод Date.parse. Как объясняется в этой документации, этот метод принимает различные форматы. В java.time есть одна точка для такого же поведения. Однако я сомневаюсь, что ваше приложение сталкивается со всеми этими синтаксисами различных форматов одновременно.

Я предлагаю вам взглянуть на конкретные форматы, используемые вашими фактическими данными. Затем создайте коллекцию объектов DateTimeFormatter для сопоставления. Обратите внимание, что в отличии от старых классов, классы java.time полностью потокобезопасный. Таким образом, вы можете хранить один набор форматеров для многократного использования в приложении и между потоками.

Для шаблона форматирования, показанного в принятом ответе, здесь приведен эквивалент в java.time с использованием класса DateTimeFormatter. Обратите внимание, что вы должны явно указать желаемую/ожидаемую локаль, а не полагаться неявно на текущую локаль JVM по умолчанию.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss zzz uuuu" , Locale.ENGLISH ) ;
ZonedDateTime zdt = ZonedDateTime.format( input , f ) ;

Вы должны по возможности избегать использования устаревших классов даты и времени, таких как java.util.Date. Но если вам нужно иметь Date для взаимодействия со старым кодом, который еще не обновлен до java.time, вы можете конвертировать. Посмотрите на новые методы преобразования, добавленные к старым классам.

Неверное имя java.util.Date представляет момент в UTC. Его современным эквивалентом является класс java.time.Instant. Мы можем извлечь Instant из нашего ZonedDateTime. Затем преобразовать в Date.

Instant instant = zdt.toInstant() ;        // Adjust from time zone to UTC.
java.util.Date d = Date.from( instant ) ;  // Convert from modern class 'Instant' to legacy class 'Date'. 

Идти в другом направлении.

Instant instant = d.toInstant() ;                                        // Convert from legacy class 'Date' to modern class 'Instant'. 
ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ;  // Adjust from UTC to the wall-clock time used by the people of a particular region (a time zone).

О java.time

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

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

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

Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*.

Где взять классы java.time?

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

Ответ 7

Для разбора строки даты и времени в формате ISO вы должны использовать DateFormat следующим образом:

java.text.DateFormat.getDateInstance().parse(dt);

С SimpleDateFormat вам нужно знать формат.