在java.sql.Timestamp中设置日期和时间

在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的

请告诉我如何使用这种构造将日期(当前日期减去一天)和时间设置为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的
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
    属于。从了解现代日期时间API
  • 无论出于何种原因,如果您必须坚持使用Java6或Java7,您都可以使用哪个后端将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认
  • 解决方案,仅使用传统API: 输出:

    2020-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
    属于。从了解现代日期时间API
  • 无论出于何种原因,如果您必须坚持使用Java6或Java7,您都可以使用哪个后端将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认
  • 解决方案,仅使用传统API: 输出:

    2020-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。供批准