[英]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。
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类所取代。
您的输入字符串采用标准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 8 及更高版本中。 这些类取代了麻烦的旧日期时间类,例如java.util.Date
、 Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅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 课程?
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.