0

如何获取 mySQL 时间戳格式mySQLtimestamp

long epochNow = System.currentTimeMillis()/1000;
long epochWeek = 604800;
long date7daysAgo = epochNo2013 w - epochWeek;
String mySQLtimestamp = /* 2013-09-23:50:00 */ 
4

2 回答 2

3

java.time

随着 2014 年 3 月 Java SE 8 的发布,过时且容易出错的旧版 Date-Time API(java.utilDate-Time 类型及其格式化类型SimpleDateFormat等)被java.time现代 Date-Time API *所取代。下描述了 ANSI SQL 类型与java.time类型的映射:

ANSI SQL Java SE 8
日期 本地日期
时间 当地时间
时间戳 本地日期时间
时区时间 偏移时间
带有时区的时间戳 偏移日期时间

注意ZonedDateTimeInstant不受任何 JDBC 驱动程序支持,而某些驱动程序(例如 PostgreSQL)也不支持OffsetTime/ TIME [ WITHOUT TIMEZONE ]。另外,请注意,所有OffsetDateTime实例都必须采用 UTC(偏移量为 0)。这是因为后端将它们存储为 UTC。

如何在 JDBC 中使用它?

下面给出了一个示例代码,用于将OffsetDateTimeUTC 中的电流插入columnfooTIMESTAMP WITH TIMEZONE类型):

OffsetDateTime odt = Instant.now().atOffset(ZoneOffset.UTC);
PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
st.setObject(1, odt);
st.executeUpdate();
st.close();

AnInstant表示时间线上的一个瞬时点,并且独立于时区,即它具有+00:00小时的时区偏移量。

OffsetDateTime下面给出了从检索 a 的示例代码columnfoo

Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE <some condition>");
while (rs.next()) {
    // Assuming the column index of columnfoo is 1
    OffsetDateTime odt = rs.getObject(1, OffsetDateTime.class));
    System.out.println(odt);
}
rs.close();
st.close();

以防万一您需要将一个转换OffsetDateTime为具有不同偏移量的另一个:

有几种方法可以做到这一点,但我主要使用OffsetDateTime#withOffsetSameInstant, 将一个转换OffsetDateTime为另一个具有不同时区偏移量的方法,例如

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        // A sample OffsetDateTime in UTC.
        OffsetDateTime odt = Instant.now().atOffset(ZoneOffset.UTC);
        System.out.println(odt);

        OffsetDateTime offsetTimeAtOffset0100 = odt.withOffsetSameInstant(ZoneOffset.of("+02:00"));
        System.out.println(offsetTimeAtOffset0100);

        // Time at JVM's default timezone offset
        ZoneOffset jvmTzOffset = ZonedDateTime.now(ZoneId.systemDefault()).getOffset();
        OffsetDateTime offsetTimeAtJvmTzOffset = odt.withOffsetSameInstant(jvmTzOffset);
        System.out.println(offsetTimeAtJvmTzOffset);
    }
}

输出:

2021-05-29T13:36:15.258076Z
2021-05-29T15:36:15.258076+02:00
2021-05-29T14:36:15.258076+01:00

与上面给出的代码相关的一些要点:

  1. Z输出中的 是零时区偏移的时区指示符。它代表 Zulu 并指定Etc/UTC时区(时区偏移量为+00:00小时)。
  2. 代码以不同的方式转换odtOffsetDateTime- 每个实例的两个实例。第一个实例具有固定的时区偏移量,+02:00而第二个实例具有 JVM 的时区偏移量。请注意,观察DST的地方的时区偏移量会根据夏季/冬季时间而变化。因此,如果一个地方遵守 DST,而不是使用固定的时区偏移量,例如+02:00小时;我们应该从 API 中获取它。
  3. 我的 JVM 的时区是Europe/London,目前它的偏移量是+01:00小时。

Trail: Date Time了解有关现代日期时间 API *的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

于 2021-05-29T13:42:51.750 回答
0

为什么不一直使用普通的Date

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, -7);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
String output = formatter.format(cal.getTime());
于 2013-09-29T16:54:33.583 回答