在java.sql.Timestamp中设置日期和时间
请告诉我如何使用这种构造将日期(当前日期减去一天)和时间设置为19:00:00在java.sql.Timestamp中设置日期和时间,java,datetime,timestamp,java-time,Java,Datetime,Timestamp,Java Time,请告诉我如何使用这种构造将日期(当前日期减去一天)和时间设置为19:00:00 new java.sql.Timestamp(java.util.Calendar.getInstance.getTime().getTime()) LocalDateTime不使用。这是我的代码 使用日历将日期设置为昨天。添加(Calendar.DAY\u OF\u YEAR,-1) 将小时与Calendar.get(Calendar.hour/OF\u DAY)进行比较。 java.sql.Timestamp的
new java.sql.Timestamp(java.util.Calendar.getInstance.getTime().getTime())
LocalDateTime不使用。这是我的代码
使用日历将日期设置为昨天。添加(Calendar.DAY\u OF\u YEAR,-1)
将小时与Calendar.get(Calendar.hour/OF\u DAY)进行比较。
java.sql.Timestamp的getHour
已被弃用
替换为Calendar.get(Calendar.HOUR/OF\u DAY)
再见 这是我的代码
使用日历将日期设置为昨天。添加(Calendar.DAY\u OF\u YEAR,-1)
将小时与Calendar.get(Calendar.hour/OF\u DAY)进行比较。
java.sql.Timestamp的getHour
已被弃用
替换为Calendar.get(Calendar.HOUR/OF\u DAY)
再见 我建议您使用
java.time
(现代日期时间API)来实现
解决方案,纯粹使用现代API:
输出:
2020-12-24T19:00Z
2020-12-24 19:00:00.0
2020-12-24 19:00:00.0
您可以在JDBC代码中使用OffsetDateTime
,如下所示:
PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
st.setObject(1, odt);
st.executeUpdate();
st.close();
但是,如果仍要使用java.sql.Timestamp
,则可以使用带有适用时区的ZoneDateTime
来获取所需的日期时间,然后将其转换为Instant
,从中可以获取历元毫秒。最后,您可以使用Epoch毫秒来构造java.sql.Timestamp
的实例
import java.sql.Timestamp;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.systemDefault())
.minusDays(1)
.with(LocalTime.of(19, 0));
Timestamp timestamp = new Timestamp(zdt.toInstant().toEpochMilli());
System.out.println(timestamp);
}
}
输出:
2020-12-24T19:00Z
2020-12-24 19:00:00.0
2020-12-24 19:00:00.0
注意事项:
2020-12-24T19:00Z
2020-12-24 19:00:00.0
2020-12-24 19:00:00.0
ZoneId.systemDefault()
,它使用JVM的时区。将其更改为适用的时区,例如(“欧洲/伦敦”)的时区Instant
属于。从了解现代日期时间API2020-12-24T19:00Z
2020-12-24 19:00:00.0
2020-12-24 19:00:00.0
我建议您使用
java.time
(现代日期时间API)来实现
解决方案,纯粹使用现代API:
输出:
2020-12-24T19:00Z
2020-12-24 19:00:00.0
2020-12-24 19:00:00.0
您可以在JDBC代码中使用OffsetDateTime
,如下所示:
PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
st.setObject(1, odt);
st.executeUpdate();
st.close();
但是,如果仍要使用java.sql.Timestamp
,则可以使用带有适用时区的ZoneDateTime
来获取所需的日期时间,然后将其转换为Instant
,从中可以获取历元毫秒。最后,您可以使用Epoch毫秒来构造java.sql.Timestamp
的实例
import java.sql.Timestamp;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.systemDefault())
.minusDays(1)
.with(LocalTime.of(19, 0));
Timestamp timestamp = new Timestamp(zdt.toInstant().toEpochMilli());
System.out.println(timestamp);
}
}
输出:
2020-12-24T19:00Z
2020-12-24 19:00:00.0
2020-12-24 19:00:00.0
注意事项:
2020-12-24T19:00Z
2020-12-24 19:00:00.0
2020-12-24 19:00:00.0
ZoneId.systemDefault()
,它使用JVM的时区。将其更改为适用的时区,例如(“欧洲/伦敦”)的时区Instant
属于。从了解现代日期时间API2020-12-24T19:00Z
2020-12-24 19:00:00.0
2020-12-24 19:00:00.0
LocalDateTime不使用您的意思是不能使用吗?我建议您不要使用
java.sql.Timestamp
和Calendar
。这些课程设计拙劣,早已过时。如果您的SQL数据类型是带时区的时间戳(建议用于大多数目的),请使用来自的OffsetDateTime
。如果是timestamp
(不带时区)或datetime
,请使用同一API中的LocalDateTime
。为什么不呢?或者换个说法:就像你说的,不要用LocalDateTime
作为时间戳。使用OffsetDateTime
或Instant
。LocalDateTime不使用您的意思是不能使用吗?我建议您不要使用java.sql.Timestamp
和Calendar
。这些课程设计拙劣,早已过时。如果您的SQL数据类型是带时区的时间戳(建议用于大多数目的),请使用来自的OffsetDateTime
。如果是timestamp
(不带时区)或datetime
,请使用同一API中的LocalDateTime
。为什么不呢?或者换个说法:就像你说的,不要用LocalDateTime
作为时间戳。使用OffsetDateTime
或Instant
——虽然这个答案通过显示Timestamp
类的更好替代方案在最好的方面很有帮助,但它也回答了问题:如何将java.sql.Timestamp
设置为昨天19。谢谢,@OleV.V。感谢您对答案的认可。正是对现代日期时间API的正确使用的积极反馈和来自日期时间拥护者(如和您)的有益评论,鼓励了许多人(如我)更深入地学习和探索现代日期时间API。事实上,我确实看到了这个答案的一个问题。第一个解决方案应将OffsetDateTime.now
替换为zoneDateTime.now
。然后在后面的代码中转换为一个OffsetDateTime
,用于JDBC 4.2。当前的代码在该地区的政客更改时区偏移量的任何日子都会失败,例如夏时制(DST)转换或。@BasilBourque-谢谢。我已经将OffsetDateTime.now
替换为zoneDateTime.now
——虽然这个答案在最好的方面很有帮助,因为它显示了Timestamp
类的更好替代品,但它也回答了问题:如何将java.sql.Timestamp
设置为昨天的19。谢谢,@OleV.V。供批准