Java 如何将特定的日期值强制写入时间戳?
所以我有一个日期值,我必须转换成时间戳,以便将该值传递给特定的方法。然而,为了完成这项工作,我被告知时间戳日期的值必须设置为1900-01-01 像这样的Java 如何将特定的日期值强制写入时间戳?,java,date,timestamp,timeofday,Java,Date,Timestamp,Timeofday,所以我有一个日期值,我必须转换成时间戳,以便将该值传递给特定的方法。然而,为了完成这项工作,我被告知时间戳日期的值必须设置为1900-01-01 像这样的 Date startDate = timesDate.getStartDate(); Timestamp startTime = new Timestamp(startDate.getTime()); 但现在我必须将日期固定到该特定值,同时保持时间不变 编辑-我必须从包含设置时间的字符串的字段中提取数据 这
Date startDate = timesDate.getStartDate();
Timestamp startTime = new Timestamp(startDate.getTime());
但现在我必须将日期固定到该特定值,同时保持时间不变
编辑-我必须从包含设置时间的字符串的字段中提取数据
这将是一个字段的开始时间,另一个字段的结束时间。保存时,字符串需要转换为时间戳,时间戳的值需要在时间值旁边加上1900-01-01
我可以回答我自己的问题吗?那么,您希望日期部分是
1900-01-01
,但时间部分是timesDate.getStartDate()中的任意时间
在构造新的时间戳之前,是否尝试使用将年、月和日设置为正确的值
当然,许多Date
方法被弃用,取而代之的是Calendar
方法,因此一种更干净的方法可能是首先将Date
转换为Calendar
对象。。。或者现在就接受警告。因此,您希望日期部分为1900-01-01
,但时间部分为timesDate.getStartDate()中的任何时间
在构造新的时间戳之前,是否尝试使用将年、月和日设置为正确的值
当然,许多Date
方法被弃用,取而代之的是Calendar
方法,因此一种更干净的方法可能是首先将Date
转换为Calendar
对象。。。或者只是暂时接受警告。这是一个开始。您应该使用LocalDate
和LocalDateTime
。这只是一种方法。可能还有其他更适合您的要求
// your epoch
LocalDate ld = LocalDate.of(1900,1,1);
System.out.println(ld);
// now tag on the time
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(2,3)); // 2:03
System.out.println(ldt);
印刷品
1900-01-01
1900-01-01T02:03
1900-01-01T16:06:50.190778200
要标记当前时间,只需执行以下操作
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.now());
System.out.println(ldt);
印刷品
1900-01-01
1900-01-01T02:03
1900-01-01T16:06:50.190778200
您将需要查看DateTimeFormatter以格式化应用程序的时间戳。有关最新时间功能的更多信息,请查看该软件包。这里是一个开始。您应该使用LocalDate
和LocalDateTime
。这只是一种方法。可能还有其他更适合您的要求
// your epoch
LocalDate ld = LocalDate.of(1900,1,1);
System.out.println(ld);
// now tag on the time
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(2,3)); // 2:03
System.out.println(ldt);
印刷品
1900-01-01
1900-01-01T02:03
1900-01-01T16:06:50.190778200
要标记当前时间,只需执行以下操作
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.now());
System.out.println(ldt);
印刷品
1900-01-01
1900-01-01T02:03
1900-01-01T16:06:50.190778200
您将需要查看DateTimeFormatter以格式化应用程序的时间戳。有关最新时间功能的更多信息,请查看该软件包。tl;博士
从遗留的java.util.Date
对象开始,更改日期,同时保持UTC中的时间
myJavaUtilDate // Your `java.util.Date` object. Now legacy; avoid!
.toInstant() // Convert fromlegacy class to modern class, `Instant`.
.atOffset( ZoneOffset.UTC ) // Convert from basic building-block class `Instant` to the more flexible class `OffsetDateTime`.
.with( // Move from one date to another.
LocalDate.of( 1900 , Month.JANUARY , 1 ) // Specify date while keeping time-of-day, and keeping the same offset-from-UTC.
) // Returns a second `OffsetDateTime` object, per immutable objects.
您可以使用JDBC 4.2或更高版本将生成的OffsetDateTime
对象传递到数据库,而不需要Timestamp
,如下所述
避免遗留日期时间类
我被告知时间戳日期的值必须设置为1900-01-01
我怀疑您对forjava.sql.Timestamp
中从1900年算起的奇怪之处感到困惑。Javadoc将第一个参数描述为:year
——年份减去1900
这将是遗留日期时间类中发现的许多扭曲的设计缺陷之一。完全避免这些课程。仅使用java.time包中的日期时间类
Instant
而不是java.util.Date
如果给定一个java.util.Date
对象,请立即转换为其替换对象Instant
Instant instant = myJavaUtilDate.toInstant() ;
如果必须生成java.sql.Timestamp
对象时间,以便与尚未更新为java.time的旧代码进行互操作,则可以转换
java.sql.Timestamp ts = Timestamp.from( instant ) ;
您不应再使用时间戳
与数据库交换值。JDBC4.2及更高版本要求支持一些java.time类,包括OffsetDateTime
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
myPreparedStatement.setObject( … , odt ) ;
检索
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
你说:
但现在我必须将日期固定到该特定值,同时保持时间不变
你把我弄丢了。编辑您的问题以澄清您的问题和期望的结果。如果您指的是上面讨论的1900奇怪之处,这是没有意义的,没有问题,如果您使用java.time类遵循我的代码
如果您确实希望日期为1900年1月1日,同时保留在传递的java.util.date
中找到的时间,则必须首先了解date
对象代表UTC中的一个时刻。因此,如果通过另一时区查看同一时刻,UTC中显示的时间可能会有所不同
我将继续假设您需要UTC中显示的时间。但您应该编辑您的问题,以澄清UTC与某些时区的区别
LocalDate ld = LocalDate.of( 1900 , Month.JANUARY , 1 ) ;
OffsetDateTime odt = myJavaUtilDate.toInstant().atOffset( ZoneOffset.UTC ).with( ld ) ;
tl;博士
从遗留的java.util.Date
对象开始,更改日期,同时保持UTC中的时间
myJavaUtilDate // Your `java.util.Date` object. Now legacy; avoid!
.toInstant() // Convert fromlegacy class to modern class, `Instant`.
.atOffset( ZoneOffset.UTC ) // Convert from basic building-block class `Instant` to the more flexible class `OffsetDateTime`.
.with( // Move from one date to another.
LocalDate.of( 1900 , Month.JANUARY , 1 ) // Specify date while keeping time-of-day, and keeping the same offset-from-UTC.
) // Returns a second `OffsetDateTime` object, per immutable objects.
您可以使用JDBC 4.2或更高版本将生成的OffsetDateTime
对象传递到数据库,而不需要Timestamp
,如下所述
避免遗留日期时间类
我被告知时间戳日期的值必须设置为1900-01-01
我怀疑您对forjava.sql.Timestamp
中从1900年算起的奇怪之处感到困惑。Javadoc将第一个参数描述为:year
——年份减去1900
这将是遗留日期时间类中发现的许多扭曲的设计缺陷之一。完全避免这些课程。仅使用java.time包中的日期时间类
Instant
而不是java.util.Date
如果给定一个java.util.Date
对象,请立即转换为其替换对象Instant
Instant instant = myJavaUtilDate.toInstant() ;
如果必须生成java.sql.Timestamp
对象时间,请与