[英]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.