在我的sqlite数据库中,我有一个带有字段created_at
的表,它将ISO8601中的时间存储为text
。在与该表相对应的对象中,我有两个用于created_at
属性的字段String date, String time
。现在,在查询该表并创建相应的对象时,我一直在将ISO8601字符串转换为当前用户的时区日期(YYYY/MM/DD(、时间(XX:YY pm(。有人能帮我吗?我曾想过使用子字符串来拆分字符串,但后来ISO8601字符串的时区是UTC。
ISO8601字符串使用Instant.now((.toString((存储在数据库中
tldr:created_at=ISO8601时间字符串;需要从中提取当前用户的日期和时间部分。
阅读ISO 8601的维基百科页面。
java.time
捕捉UTC中的当前时刻。
Instant instant = Instant.now() ;
生成ISO 8601字符串。
String output = instant.toString() ;
结果字符串末尾的Z
表示与UTC的偏移量为零小时分秒。
调整到特定的时区。
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
不幸的是,ISO 8601标准并没有定义时区中的格式。ZonedDateTime#toString
方法使用类似于ISO8601的格式,但将时区名称附加在方括号中。这是一个明智的解决方案。
String output = zdt.toString() ;
你的大部分问题都不清楚。我猜你想从ZonedDateTime
中提取日期和时间部分。但我不确定使用这样的值来查询数据库是否有意义。但如果你坚持:
LocalDate ld = zdt.toLocalDate() ;
LocalTime lt = zdt.toLocalTime() ;
您可以为每个字符串获取一个ISO 8601字符串。
String ldOutput = ld.toString() ;
String ltOutput = lt.toString() ;
请注意,不需要您在问题中提到的字符串操作。
我想你可以在这里看到这个链接,你可能会找到一些答案。
但是举个例子,你可以在这里看到这个例子。我有一个String格式,并将其转换为Date对象。
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
String string1 = "2001-07-04T12:08:56.235-0700";
Date result1 = df1.parse(string1);