Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将特定的日期值强制写入时间戳?_Java_Date_Timestamp_Timeofday - Fatal编程技术网

Java 如何将特定的日期值强制写入时间戳?

Java 如何将特定的日期值强制写入时间戳?,java,date,timestamp,timeofday,Java,Date,Timestamp,Timeofday,所以我有一个日期值,我必须转换成时间戳,以便将该值传递给特定的方法。然而,为了完成这项工作,我被告知时间戳日期的值必须设置为1900-01-01 像这样的 Date startDate = timesDate.getStartDate(); Timestamp startTime = new Timestamp(startDate.getTime()); 但现在我必须将日期固定到该特定值,同时保持时间不变 编辑-我必须从包含设置时间的字符串的字段中提取数据 这

所以我有一个日期值,我必须转换成时间戳,以便将该值传递给特定的方法。然而,为了完成这项工作,我被告知时间戳日期的值必须设置为1900-01-01

像这样的

        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

我怀疑您对for
java.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

我怀疑您对for
java.sql.Timestamp
中从1900年算起的奇怪之处感到困惑。Javadoc将第一个参数描述为:
year
——年份减去1900

这将是遗留日期时间类中发现的许多扭曲的设计缺陷之一。完全避免这些课程。仅使用java.time包中的日期时间类

Instant
而不是
java.util.Date
如果给定一个
java.util.Date
对象,请立即转换为其替换对象
Instant

Instant instant = myJavaUtilDate.toInstant() ;
如果必须生成
java.sql.Timestamp
对象时间,请与