繁体   English   中英

如何正确解析 Kotlin 中的日期?

[英]How to parse correctly a Date in Kotlin?

我有以下错误。 我有一个 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,但它返回一个字符串,我希望它是一个日期

解析后的变量类型必须是 Date,而不是 LocalDate。

tl;博士

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

Date class — 不适用于日期

java.util.Date class 的众多缺陷之一就是它的名字。 不代表日期。 那 class 代表一个时刻,一个以 UTC 为单位的日期。

更令人困惑的是,它的toString方法动态地应用了 JVM 当前的默认时区。

从不使用Date

Both the java.util.Date class and java.sql.Date class are terrible, flawed in design, written by people who did not understand date-time handling. 避免使用它们,以及SimpleDateFormat等。Sun、Oracle 和JCP社区几年前就放弃了这些课程,你也应该如此。

java.time

这些遗留类在几年前被现代java.time类所取代。

您的输入字符串采用标准ISO 8601格式。 java.time类在解析/生成字符串时默认使用这些格式。

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

数据库

从 JDBC 4.2 及更高版本起,您可以将java.time object 与您的数据库交换。 确保您的JDBC 驱动程序是最新的。

您应该将LocalDate object 写入类似于 SQL 标准类型DATE的类型的列。

myPreparedStatement.setObject( … , ld ) ;

恢复。

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

关于java.time

java.time框架内置于 Java 8 及更高版本中。 这些类取代了麻烦的日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅Oracle 教程 并在 Stack Overflow 上搜索许多示例和解释。 规范是JSR 310

现在处于维护模式Joda-Time项目建议迁移到java.time类。

您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC 驱动程序 不需要字符串,不需要java.sql.*类。 Hibernate 5 & JPA 2.2 支持java.time

从哪里获得 java.time 课程?

哪个 java.time 库与哪个版本的 Java 或 Android 一起使用的表

Object 的 class 日期可以以多种格式打印。

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"

我相信你已经有了正确的代码。 但问题似乎是您应该使用正确的字符串。 您提出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)
}

我在 CEST 获得Thu Aug 06 00:00:00 CEST 2020 CEST因为我位于中欧。

此外,这篇文章Java 字符串到日期转换涵盖了您所寻求的很多内容。

val dateString = "2020-07-05"
dateString.format(DateTime())
//Log.d("DateTest", dateString.format(DateTime()))

尝试这个。 它应该工作。 这会将字符串转换为 DateTime() 格式。

您是否尝试过使用 Locale.Default?

你使用 Android 所以你的数据库很可能是 SQLite (也当你使用房间时)。 这意味着您不能将数据存储为日期,请参见此处https://www.sqlitetutorial.net/sqlite-date/

SQLite 不支持内置日期和/或时间存储 class。 相反,它利用一些内置的日期和时间函数来使用其他存储类(例如 TEXT、REAL 或 INTEGER)来存储日期和时间值。

所以基本上你可以将它存储为Int然后当你检索它时你可以将它转换为Date

val date = "2020-07-07"

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

formatter.parse(date)

这肯定会奏效

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM