簡體   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