Как превратить строковую дату в длинную? - PullRequest
0 голосов
/ 12 мая 2018

У меня есть переменная String, и я бы хотел превратить ее в переменную long.

String dtStart = "2018-04-25 20:09:55";
                    Date date = null;
                    long dateLong = 0;
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
                    try {
                        date = format.parse(dtStart);


                        dateLong = date.getTime();
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }

Переменная dtStart не должна изменять значение, она говорит dateLong = 0, я бы хотел превратить эту переменную в long переменную в dateLong.

Также я могу превратить dtStartd в "2010-10-15T09:27:37Z", этот формат, но я не знаю, как.

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

2018-04-25 20:09:55 соответствует yyyy-MM-dd HH:mm:ss

Таким образом, вы должны использовать этот формат

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

yyyy для года

MMдля месяца

dd для даты

HH для 24-часового формата времени (hh для 12 часов)

mm для минуты

ss для секунды

Вы можете и должны прочитать о форматах строк Java на ссылка

0 голосов
/ 12 мая 2018

tl; др

LocalDateTime.parse(                             // Parse string as a `LocalDateTime`. Lacking any time zone or offset-from-UTC means this is *not* a moment, *not* a point on the timeline.
    "2018-04-25 20:09:55".replace( " " , "T" )   // Alter input to comply with ISO 8601 standard format, used by default in the *java.time* classes.
)                                                // Returns a `LocalDateTime` object.
.atZone(                                         // Give context and meaning to our `LocalDateTime`, to determine a point on the timeline.
    ZoneId.of( "America/Montreal" )              // Always specify time zone using proper `Continent/Region` format, never 3-4 letter pseudo-zones such as `PST`, `CST`, `IST`.
)                                                // Returns a `ZonedDateTime` object.
.toInstant()                                     // 2018-04-26T00:09:55Z. Extract a UTC value, `Instant` object, from the `ZonedDateTime`.
.toEpochMilli()                                  // Ask for count of milliseconds from 1970-01-01T00:00Z to this moment. 

1524701395000

java.time

Измените ввод строки в соответствии со стандартом ISO 8601.

String input = "2018-04-25 20:09:55".replace( " " , "T" ) ;

2018-04-25 20: 09: 55

Разбор.

LocalDateTime ldt = LocalDateTime.parse( input ) ;

ldt.toString (): 2018-04-25T20: 09: 55

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

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

zdt.toString (): 2018-04-25T20: 09: 55-04: 00 [Америка / Монреаль]

Извлечениезначение в UTC, Instant.

Instant instant = zdt.toInstant();

instant.toString (): 2018-04-26T00: 09: 55Z

Получить счетчикмиллисекунды с первого момента 1970 UTC, 1970-01-01T00: 00Z.

long millis = instant.toEpochMilli() ;

1524701395000

Если эта входная строка была предназначена для UTC, а не длячасовой пояс (ваш вопрос неясен в этом отношении), используйте те же идеи, что и выше, но переключитесь на OffsetDateTime и ZoneOffset вместо ZonedDateTime и ZoneId.

LocalDateTime.parse(                     
    "2018-04-25 20:09:55".replace( " " , "T" )  
)                                        
.atOffset(                                     
    ZoneOffset.UTC                        // Using `ZoneOffset` rather than `ZoneId`. For UTC, we have the constant `ZoneOffset.UTC`. 
)                                         // Returns an `OffsetDateTime` object.                                            
.toInstant()                              // 2018-04-25T20:09:55Z
.toEpochMilli()  

Обратите внимание, что мы получаем результат, отличный от указанного выше, так как 20:00 в UTC - это другой момент, чем 20:00 в Монреале-Квебеке.

1524686995000


О java.time

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

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

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

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

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

  • Java SE 8 , Java SE 9 , Java SE 10, а позже
    • Встроенный.
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации комплекта Android-классов java.time.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

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

0 голосов
/ 12 мая 2018

Ваша строка формата не соответствует формату, используемому строкой даты.Ваша строка даты имеет следующий формат:

yyyy-MM-dd HH:mm:ss

Итак

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

Это также означает, что вы не знаете часовой пояс строки даты.Пожалуйста, примите это к сведению.

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