Непрозрачный формат даты java ParseException [duplicate]

Строка ошибки «Ссылка на объект, не установленная на экземпляр объекта.» указывает, что вы не назначили экземпляр объекта объектной ссылке, и все же вы получаете доступ к свойствам / методам этого объекта.

например: скажем, у вас есть класс под названием myClass и он содержит одно свойство prop1.

public Class myClass
{
   public int prop1 {get;set;}
}

Теперь вы получаете доступ к этому prop1 в каком-то другом классе, как показано ниже:

public class Demo
{
     public void testMethod()
     {
        myClass ref = null;
        ref.prop1 = 1;  //This line throws error
     }
}

выше строки выдает ошибку, потому что ссылка класса myClass объявлена, но не создана, или экземпляр объекта не назначается referecne этого класса.

Чтобы исправить это, вам нужно создать экземпляр (присвоить объект ссылке на этот класс).

public class Demo
{
     public void testMethod()
     {
        myClass ref = null;
        ref = new myClass();
        ref.prop1 = 1;  
     }
}
14
задан Amokrane Chentir 27 May 2011 в 16:56
поделиться

2 ответа

35
ответ дан a_horse_with_no_name 3 September 2018 в 13:17
поделиться

tl; dr

java.util.Date.from (

    LocalDateTime.parse( 
        "Wed, 09 Feb 2011 12:34:27" , 
        DateTimeFormatter.ofPattern( "EEE, dd MMM uuuu HH:mm:ss" , Locale.US )
    ).atZone( ZoneId.of( "America/Montreal" ) )
     .toInstant()

)

Подробности

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

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

В строке ввода отсутствует какая-либо индикация часового пояса или offset-from-UTC. Итак, мы анализируем как OffsetDateTime .

Укажите Locale , чтобы определить (a) человеческий язык для перевода имени дня, название месяца и т. д., и (б) культурные нормы, решающие вопросы аббревиатуры, капитализации, пунктуации, разделители и т. д.

String input = "Wed, 09 Feb 2011 12:34:27" ;
Locale l = Locale.US ; 
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE, dd MMM uuuu HH:mm:ss" , l ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

ldt.toString (): 2011-02 -09T12: 34: 27

Часовой пояс

Как в вопросе, так и в другом ответе игнорируется ключевая проблема часового пояса.

В строке ввода отсутствует часовой пояс или смещение. Мы проанализировали как LocalDateTime, который не момент на временной шкале, только смутное представление о возможных моментах. Например, «Рождество начинается в полночь 25 декабря 2017 года», это не имеет значения, пока вы не разместите его в контексте определенного часового пояса. Рождество происходит гораздо раньше в Окленде Новая Зеландия, чем в Париже во Франции, а еще много еще в Монреале Квебеке.

Если вы знаете предполагаемый часовой пояс, назначьте ZoneId для создания ZonedDateTime.

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ldt.atZone( z ); // Assigning a time zone to determine an actual moment on the timeline.

Преобразование

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

A java.util.Date - момент на временной шкале в UTC. Поэтому нам нужно извлечь Instant из нашего ZonedDateTime. Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной доля).

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

Переход в другое направление.

Instant instant = d.toInstant() ;  // Convert from legacy class to java.time class.
ZonedDateTime zdt = instant.atZone( z ) ;  // Adjust from UTC into a particular time zone.

О java.time

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

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

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

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

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

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

3
ответ дан Basil Bourque 3 September 2018 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: