日期对象解析

问题描述 投票:0回答:2

我正在尝试在java中解析输入日期,在调试器中如下所示。我需要将其转换为:2019-09-28 20:00:00.0

result = {Date@13861} "2019-09-29"
 fastTime = 1569729600000
 cdate = {Gregorian$Date@13873} "2019-09-29T00:00:00.000-0400"

我的代码:

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);

我在这里想念什么?

谢谢。

java date
2个回答
1
投票

您的问题缺少时区信息,但这是将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

0
投票

如果这是为您的SQL数据库添加时间戳,请不要将时间戳作为字符串。给它一个适当的日期时间对象。从JDBC 4.2开始,这意味着:

  • 对于SQL timestamp with time zone(出于绝大多数目的,建议使用)提供OffsetDateTime;许多驱动程序也接受Instant
  • 对于没有时区的SQL 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,则将是有利的。

© www.soinside.com 2019 - 2024. All rights reserved.