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

Set date and time in java.sql.Timestamp

请告诉我如何使用这种结构设置日期(当前日期减去一天)和时间等于 19:00:00?

new java.sql.Timestamp(java.util.Calendar.getInstance.getTime().getTime())

不使用 LocalDateTime。

这是我的代码

使用 Calendar.add(Calendar.DAY_OF_YEAR, -1)

将日期设置为昨天

将小时与 Calendar.get(Calendar.HOUR_OF_DAY)

进行比较 java.sql.Timestamp 的

getHour 已弃用。

替换为Calendar.get(Calendar.HOUR_OF_DAY).

import java.sql.Timestamp;
import java.util.Calendar;

Calendar calendar = Calendar.getInstance(); // 2020-12-25 19:42:57.739
calendar.add(Calendar.DAY_OF_YEAR, -1);
Timestamp timestamp = new Timestamp(calendar.getTimeInMillis());

System.out.println(timestamp); // 2020-12-24 19:42:57.739
System.out.println(19 == calendar.get(Calendar.HOUR_OF_DAY)); // true

再见!

我建议您使用 java.time(现代日期时间 API)。

解决方案,纯粹使用现代API:

import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        OffsetDateTime odt = ZonedDateTime.now(ZoneId.systemDefault())
                                .minusDays(1)
                                .with(LocalTime.of(19, 0))
                                .toOffsetDateTime();

        System.out.println(odt);
    }
}

输出:

2020-12-24T19:00Z

您可以在 JDBC 代码中使用 OffsetDateTime,如下所示:

PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
st.setObject(1, odt);
st.executeUpdate();
st.close();

但是,如果您仍然想使用 java.sql.Timestamp,您可以使用 ZonedDateTime 和适用的时区来获取所需的日期时间,然后将其转换为 Instant你可以获得 Epoch 毫秒。您可以最终使用 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-24 19:00:00.0

备注:

  1. 我使用了 ZoneId.systemDefault(),它使用 JVM 的时区。将其更改为适用的时区,例如ZoneId.of("Europe/London").
  2. Instant属于modern date-time API. Learn about the modern date-time API from Trail: Date Time.
  3. 无论出于何种原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and .

解决方案,纯粹使用遗留API:

import java.sql.Timestamp;
import java.util.Calendar;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_YEAR, -1);
        calendar.set(Calendar.HOUR_OF_DAY, 19);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        Timestamp timestamp = new Timestamp(calendar.getTimeInMillis());
        System.out.println(timestamp);
    }
}

输出:

2020-12-24 19:00:00.0