[英]Date object formatting
我正在尝试在 Java 中格式化输入日期,它在调试器中如下所示。
result = {Date@13861} "2019-09-29"
fastTime = 1569729600000
cdate = {Gregorian$Date@13873} "2019-09-29T00:00:00.000-0400"
我需要将其转换为: 2019-09-28 20:00:00.0
。
我的代码:
DateTimeFormatter dateTimeformatter_Test = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
LocalDate tempDate = LocalDate.parse(date.toString(), DateTimeFormatter.ofPattern( "yyyy-MM-dd" , Locale.US ));
但下面的行抛出一个运行时错误说:不支持的字段:HourOfDay
String result= tempDate.format(dateTimeformatter_Test);
请问我在这里缺少什么?
谢谢。
您的问题缺少时区信息,但这是将2019-09-29
转换为2019-09-28 20:00:00.0
一种方法:
System.out.println(
LocalDate.parse("2019-09-29")
.atStartOfDay(ZoneOffset.UTC)
.withZoneSameInstant(ZoneId.of("America/New_York"))
.format(DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.S")));
输出
2019-09-28 20:00:00.0
这是一种完全不同的方式,显示您在调试器中看到的值:
TimeZone.setDefault(TimeZone.getTimeZone("America/New_York"));
java.sql.Date result = java.sql.Date.valueOf("2019-09-29");
System.out.println("result = " + result);
long fastTime = result.getTime();
System.out.println("fastTime = " + fastTime);
System.out.println("cdate = " + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").format(result));
ZonedDateTime zdt = Instant.ofEpochMilli(fastTime).atZone(ZoneId.of("America/Anchorage"));
System.out.println("zdt = " + zdt.format(DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.S")));
输出
result = 2019-09-29
fastTime = 1569729600000
cdate = 2019-09-29T00:00:00.000-0400
zdt = 2019-09-28 20:00:00.0
如果这是用于 SQL 数据库的时间戳:不要将时间戳作为字符串提供给数据库。 给它一个合适的日期时间对象。 从 JDBC 4.2 开始,这意味着:
timestamp with time zone
的 SQL timestamp with time zone
(推荐用于绝大多数用途)提供OffsetDateTime
; 许多司机也接受Instant
。timestamp
,提供LocalDateTime
。例如:
java.sql.Date inputDate = getFromSomewhere();
OffsetDateTime dateTimeForDatabase = inputDate.toLocalDate()
.atStartOfDay(ZoneOffset.UTC)
.toOffsetDateTime();
System.out.println(dateTimeForDatabase);
PreparedStatement stmt = yourDatabaseConnection.prepareStatement(
"insert into your_table(your_timestamp_col) values (?)");
stmt.setObject(1, dateTimeForDatabase);
int rowsInserted = stmt.executeUpdate();
中间打印语句的示例输出:
2019-09-29T00:00Z
Z
表示 UTC,因此这与您要求的2019-09-28 20:00:00.0
时间点相同,假设您的 JVM 时区是北美东部时间(美国/多伦多或美国/纽约)。
您在调试器中看到的对象看起来非常像java.sql.Date
对象,因此我将这种类型作为我的起点。 java.sql.Date
类的设计很糟糕,但实际上,它是在已经设计得很糟糕的java.util.Date
类之上的一个真正的黑客。 它也早已过时。 因此,如果您可以获得现代类型,例如LocalDate
,那将是有利的。
LocalDate
是没有时间的日期,例如 2019-09-29。 您试图使用格式模式yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
格式化一个。 所以你要求在结果中包含一天中的时间,但正如我所说, LocalDate
没有一天中的时间,所以这没有意义。 您收到的错误消息实际上非常准确:
不支持的字段:HourOfDay
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.