如何在JAVA中将epoch转换为mySQL时间戳

时间:2013-09-29 16:51:19

标签: java mysql epoch

如何在mySQLtimestamp中获取mySQL时间戳格式?

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

2 个答案:

答案 0 :(得分:2)

java.time

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

<头>
ANSI SQL Java SE 8
日期 本地日期
时间 本地时间
时间戳 本地日期时间
TIME WITH TIMEZONE 偏移时间
带时区的时间戳 偏移日期时间

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

如何在JDBC中使用它?

下面给出了一个示例代码,用于将 UTC 中的当前 OffsetDateTime 插入到 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();

Instant 代表时间线上的一个瞬时点,与时区无关,即它的时区偏移为 +00:00 小时。

下面给出了从 OffsetDateTime 检索 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

输出:

Z

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

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

modern date-time API 了解有关 Trail: Date Time* 的更多信息。


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

答案 1 :(得分: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());