2017-01-25 5 views
0

То, что я встречаю, довольно своеобразно.Формат yyyy-MM-dd HH: mm: ss from String to date Формат

Мой код:

val aa = "2017-01-17 01:33:00" 
    val bb = "04:33" 
    val hour = bb.substring(0, bb.indexOf(":")) 
    val mins = bb.substring(bb.indexOf(":") + 1, bb.length()) 
    val negatedmins = "-" + mins 
    val ecoffsethour = hour.toLong 
    val ecoffsetmins = negatedmins.toLong 
    println(aa) 
    val datetimeformatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") 
    val txn_post_date_hkt_date_parsed = LocalDateTime.parse(aa, datetimeformatter) 
    println(txn_post_date_hkt_date_parsed) 
    val minushours = txn_post_date_hkt_date_parsed.minusHours(ecoffsethour) 
    println(minushours) 
    val minusmins = minushours.minusMinutes(ecoffsetmins) 
    println(minusmins) 
    val offsetPostdateDiff = minusmins.toString().replace("T", " ") 
    println(offsetPostdateDiff) 

Выход:

2017-01-17 01:33:00 
2017-01-17T01:33 
2017-01-16T21:33 
2017-01-16T22:06 
2017-01-16 22:06 

В том же коде я меняю только "аа" значение ==>2017-01-17 01:33:44

Теперь выход:

2017-01-17 01:33:44 
2017-01-17T01:33:44 
2017-01-16T21:33:44 
2017-01-16T22:06:44 
2017-01-16 22:06:44 

Почему первый метод не учитывает поле секунд?

Мое требование: Однако выход должен прийти в «гггг-ММ-дд HH: сс: мм» формат.

Я совершенно новый для Скалы. Пожалуйста, просветите меня.

+1

Вы только с помощью форматирования для разбора не печатать дату. Еще одна проблема, вы делаете арифметику времени, которая уже предоставляется. – pedrofurla

+0

@pedrofurla: Эта артриттика соответствует моим требованиям. Надеюсь, что это не имеет никакого отношения к этой проблеме. –

ответ

0

Обычно лучше указать формат, в котором вы хотите получить.

Таким образом, вместо

println datetime 

Вы можете сделать что-то вроде этого:

println datetimeformat.print(datetime) 

Удачи!

Edit: Изменение сделано, чтобы сделать 2 выражение точно эквивалентного

+0

Фактически 'println (datetimeformat.print (datetime))' – pedrofurla

+0

Спасибо @pedrofurla. –

1

По умолчанию формата ISO 8601

Классы java.time используют стандартные ISO 8601 форматов по умолчанию при разборе/генерации строк для представления даты-времени стоимость.

Стандартный формат локальной даты - это то, что вы видите с T посередине: YYYY-MM-DDTHH:MM:SS.SSSSSSSSS.

LocalDateTime ldt = LocalDateTime.now(ZoneId.of("America/Montreal")) ; 
String output = ldt.toString() ; 

2017-01-23T12: 34: 56,789

Ваш вызов println(txn_post_date_hkt_date_parsed) неявно вызова встроенного toString метода на LocalDateTime объекта, и, таким образом, задавая для стандартного формата ISO 8601 с T.

println(txn_post_date_hkt_date_parsed.toString()) 

Смещения

На несвязанной ноте, вы работаете слишком трудно. Классы java.time обрабатывают смещения. Я не понимаю, почему вы хотите компенсировать такое нечетное число (четыре часа и тридцать три минуты), но так оно и есть.

Вот ваш код исправлен, но в синтаксисе Java.

String input = "2017-01-17 01:33:00" ; 

DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") ; 
LocalDateTime ldt = LocalDateTime.parse(input , f) ; 
OffsetDateTime utc = ldt.atOffset(ZoneOffset.UTC) ; 

ZoneOffset offset = ZoneOffset.of("-04:33") ; // Behind UTC by four hours and thirty-three minutes. 
OffsetDateTime odt = utc.withOffsetSameInstant(offset) ; 

Вы можете увидеть это code run live at IdeOne.com. Обратите внимание, как wall-clock time вашего offset-from-UTC находится на предыдущей дате. Тот же момент в истории, тот же самый момент на шкале времени, но просматривается через два разных времени настенных часов (UTC и четыре часа и тридцать три минуты позади).

Z на конце стандарт ISO 8601 обозначение, сокращение от Zulu и значение UTC.

вход: 2017-01-17 01:33:00

ldt.toString(): 2017-01-17T01: 33

utc.toString(): 2017-01-17T01 : 33Z

odt.toString(): 2017-01-16T21: 00-04: 33