【问题标题】:java time (Wed Feb 29 20:56:47 +0000 2012) to epochjava时间(2012年2月29日星期三20:56:47 +0000)到纪元
【发布时间】:2012-03-21 19:51:28
【问题描述】:

我有一个数据库,其中包含以下格式的时间戳:

Wed Feb 29 20:56:47 +0000 2012
Wed Feb 29 00:32:48 +0000 2012
Fri Apr 01 00:10:30 +0000 2011

我需要将 Epoch 转换为 Epoch 时间才能轻松进行计算。

我希望它们是 1970 年以来的秒数(就像 System.currentTimeMillis()/1000 所做的那样)

java 是否有一些方法可以解决这个问题,还是我必须解析和计算它?提前致谢。

【问题讨论】:

  • 您想在哪里执行这些计算?在您的代码中还是在数据库级别?

标签: java time epoch


【解决方案1】:

你必须解析它,但这很容易使用SimpleDateFormat

SimpleDateFormat format = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy",
                                               Locale.US);

Date date = format.parse(text);
long secondsSinceEpoch = date.getTime() / 1000;

另一方面,最好将数据库中的值存储在更合适的列类型中。您真的将它们存储为文本吗?如果有,为什么?

【讨论】:

  • 我只需要一个标准。 Epoch 对我来说似乎是最容易使用的。我需要计算时间间隔并转换为不同代码语言的不同格式。
  • @PatrickLorio:但是为什么要在数据库中使用 text 呢?当然,您的数据库具有某种 DATETIME 字段类型,即使没有,将自纪元以来的毫秒数或秒数存储为数字会更有效。为什么要一直进行解析和格式化? (请注意,使用非文本格式,您可以在 SQL 中计算时间间隔,以及执行过滤比较等。)
  • 抱歉,我认为我没有正确回答您的问题。我会将纪元时间存储为数字。我只会将它格式化一次到数据库中。并将其转换为不同的格式将在客户端。另外我不会做 SQL 操作,它只是一个存储我的数据的地方,而不是通过它来处理。
  • @PatrickLorio:但是为什么还要将它以文本形式存储在数据库中呢?为什么要无缘无故地引入转换?只需将其保留为“纪元秒数”或更强类型的值即可。
【解决方案2】:

使用现代 API java.time 的解决方案:

您的日期时间字符串具有时区偏移值,因此可以将其解析为 OffsetDateTime 对象,您可以将其转换为 Instant。函数Instant#toEpochMilli 将瞬间转换为从 1970-01-01T00:00:00Z 开始的毫秒数。

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("E MMM d H:m:s X u", Locale.ENGLISH);
        OffsetDateTime odt = OffsetDateTime.parse("Wed Feb 29 20:56:47 +0000 2012", dtf);
        Instant instant = odt.toInstant();
        long epochSecond = TimeUnit.SECONDS.convert(instant.toEpochMilli(), TimeUnit.MILLISECONDS);
        System.out.println(epochSecond);
    }
}

输出:

1330549007

如果您有可用的标准 API(例如上面代码中使用的TimeUnit#convert)来实现您对计算的处理,请尽量避免自己执行计算。

Trail: Date Time了解更多关于java.timemodern date-time API*的信息。


* 出于任何原因,如果您必须坚持使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    相关资源
    最近更新 更多