Как правильно разобрать дату в Kotlin? - PullRequest
0 голосов
/ 06 августа 2020

У меня следующая ошибка. У меня есть String = "2020-07-07", и я хочу его как Date, чтобы я мог сохранить его в своей БД. Итак, я сделал это:

val date = "2020-07-07"

val formatter = SimpleDateFormat("yyyy-MM-dd", Locale.US) 

formatter.parse(date)

Но я получаю следующее:

Tue Jul 07 00:00:00 GMT-03:00 2020

Что я делаю не так? Пожалуйста, помогите!

Я пробовал использовать formatter.format, но он возвращает String, и я хочу, чтобы это была Date

Тип переменной после синтаксического анализа ДОЛЖЕН быть Date, а не LocalDate.

Ответы [ 7 ]

1 голос
/ 07 августа 2020

Объект класса Date может быть напечатан во многих форматах.

val date: String = "2020-07-07"
val formatter = SimpleDateFormat("yyyy-MM-dd", Locale.US) 
val dateDate: Date = formatter.parse(date) // You got Date object of 2020 jul 7

println(formatter.format(dateDate)) //it prints "2020-07-07"
println(dateDate)                   // without formatter it print default format 
                                    // "Tue Jul 07 00:00:00 GMT-03:00 2020"
0 голосов
/ 07 августа 2020

tl; dr

myPreparedStatement.setObject( … , LocalDate.parse( "2020-07-07" ) ) 

Date класс - не для дат

Одним из многих fl aws в классе java.util.Date является его имя. Это не представляет дату. Этот класс представляет момент, дату со временем дня, как показано в UT C.

Добавляет путаницу то, что его метод toString динамически применяет текущий часовой пояс JVM по умолчанию.

Никогда не используйте Date

И класс java.util.Date, и класс java.sql.Date ужасны, имеют недостатки в дизайне, написаны людьми, которые не понимали обработки даты и времени. Избегайте их вместе с SimpleDateFormat и c. Sun, Oracle и сообщество JCP отказались от этих занятий в go, и вы тоже должны.

java .time

Эти устаревшие классы были вытеснены годами a go современными java .time классами.

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

LocalDate ld = LocalDate.parse( "2020-07-07" ) ;

База данных

Вы можете обменять java. time с вашей базой данных, начиная с JDB C 4.2 и новее. Убедитесь, что ваш JDB C драйвер обновлен.

Вы должны записывать объект LocalDate в столбец типа, близкого к SQL -стандарту введите DATE.

myPreparedStatement.setObject( … , ld ) ;

Получение.

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

Примерно java .time

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

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

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

Вы можете обменивать объекты java .time непосредственно с вашей базой данных. Используйте драйвер JDB C , совместимый с JDB C 4.2 или новее. Нет необходимости в строках, нет необходимости в классах java.sql.*. Поддержка Hibernate 5 и JPA 2.2 java .time .

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

  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 и выше - часть стандартного Java API с объединенной реализацией.
    • Java 9 внесены некоторые незначительные изменения и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java .time вернулась перенесено на Java 6 и 7 дюймов ThreeTen-Backport .
  • Android
    • Более поздние версии Android (26+) реализации пакетов классов java .time .
    • Для более ранних Android (<26), процесс, известный как <a href="https://developer.android.com/studio/write/java8-support#library-desugaring" rel="nofollow noreferrer"> API Desugaring , приносит подмножество java .time функциональности, которая изначально не использовалась встроен в Android.

Таблица того, какая библиотека java .time для использования с какой версией Java или Android

0 голосов
/ 07 августа 2020
val date = "2020-07-07"

val formatter = SimpleDateFormat("yyyy-MM-dd") // change in this line 

formatter.parse(date)

Это обязательно сработает

0 голосов
/ 07 августа 2020

вы используете Android, поэтому ваша БД, скорее всего, SQLite (также когда вы используете Room). Это означает, что вы не можете хранить данные как Date, см. Здесь https://www.sqlitetutorial.net/sqlite-date/

SQLite не поддерживает встроенный класс хранения даты и / или времени. Вместо этого он использует некоторые встроенные функции даты и времени для использования других классов хранения, таких как TEXT, REAL или INTEGER, для хранения значений даты и времени.

Таким образом, вы можете хранить его, например, как Int, а затем, когда вы его получите, вы можете преобразовать его в Date

0 голосов
/ 07 августа 2020

Вы пробовали использовать Locale.Default?

0 голосов
/ 06 августа 2020
val dateString = "2020-07-05"
dateString.format(DateTime())
//Log.d("DateTest", dateString.format(DateTime()))

Попробуй. Он должен работать. Это преобразует строку в формат DateTime ().

0 голосов
/ 06 августа 2020

Я считаю, что у вас уже есть правильный код. Но проблема, похоже, в том, что вы должны использовать правильную строку. Вы представляете 2020-08-06, но затем меняете его на 2020-07-07.

Полный код:

import java.text.DateFormat
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.*

@Throws(ParseException::class)
fun main() {
    val rawDate: String = "2020-08-06"
    val format: DateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.US)
    val date: Date = format.parse(rawDate)
    println(date)
}

Я получаю Thu Aug 06 00:00:00 CEST 2020 с CEST, потому что я нахожусь в Центральной Европе .

Кроме того, этот пост Java преобразование строки в дату охватывает многое из того, что вы ищете.

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