在Java中使用不同的日期作为UNIX纪元时间?

时间:2014-07-02 19:54:12

标签: java

我知道标准的UNIX纪元时间是1/1/70,我可以使用这个变量将当前时间转换为UNIX时间:

int time =(int)((System.currentTimeMillis())/ 1000);

(注意:我知道它通常存储为64位长,但我需要它为32位,因此转换为int)。

我的问题是 - 在Java中是否有任何内置方法,您可以将其作为"纪元日期传递给另一个日期。"我想要得到的是一个特定日期以来的秒数的时间戳。即我想将2015年1月1日定义为MY epoch。然后每个未来日期将是自2015年1月1日以来的秒数。

如果没有提供该功能的Java库,那么有关如何执行此操作的任何想法? 谢谢, 添

3 个答案:

答案 0 :(得分:3)

不需要库,你只需要使用数学。

static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
static final long EPOCH = new Date(2015 - 1900, Calendar.JANUARY, 1).getTime(); // 2015/1/1 in GMT

public static int secondSinceEpoch() {
    return (int) ((System.currentTimeMillis() - EPOCH) / 1000);
}

public static String epochToString(int secsSince2015) {
    return SDF.format(new Date(secsSince2015 * 1000 + EPOCH));
}

public static void main(String... ignored) {
    System.out.println(new Date(EPOCH));
    System.out.println("Epoch is " + epochToString(0));
    System.out.println("Today is " + secondSinceEpoch() + " secs");
    System.out.println("Today is " + secondSinceEpoch() / 86400 + " days");
}

打印

Thu Jan 01 00:00:00 GMT 2015
Epoch is 2015/01/01 00:00:00
Today is -15732850 secs
Today is -182 days

答案 1 :(得分:1)

您可能需要推出自己的时间和日期方法,这些方法基本上会重新打包标准方法,同时减去时间段的正确秒数以达到新纪元。

所以,也许像是

public class MyEpoch {
    public static final Long MY_EPOCH = //number of seconds betweer 1/1/70 and 1/1/2015
    private Date unixEpochDate;
    //etc
    public Long getMyEpoch() {
        return unixEpochDate.getTime() - MY_EPOCH;
    }
}

答案 2 :(得分:0)

TL;博士

long totalSeconds = Duration.between ( OffsetDateTime.of ( 2015 , 1 , 1 , 0 , 0 , 0 , 0 , ZoneOffset.UTC ) , OffsetDateTime.now ( ZoneOffset.UTC ) ).getSeconds ();

经过时间

忘掉epoch reference date。你想要的只是经过的时间。

java.time

java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormatJoda-Time团队还建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。

时区

您的问题无法解决时区的关键问题。

由于您提到了Unix风格的时间,我假设您打算使用UTC时区。 Instant类表示UTC时间轴上的一个时刻,分辨率高达纳秒。要获得包括格式化在内的更多灵活性,请使用指定偏移量为UTC的OffsetDateTime

Duration

OffsetDateTime类表示具有指定的UTC偏移量的日期和时间。我们可以将常量ZoneOffset.UTC指定为偏移值。

Duration类表示一个时间跨度,以秒为单位加上以秒为单位的小数秒。我们可以从Duration对象中获取OffsetDateTime个对象。

调用Duration::getSeconds获取持续时间中的总秒数。但请注意,我们可能会丢失数据,因为任何小数秒都会自然地从结果数中省略。

OffsetDateTime start = OffsetDateTime.of ( 2015 , 1 , 1 , 0 , 0 , 0 , 0 , ZoneOffset.UTC );
OffsetDateTime now = OffsetDateTime.now ( ZoneOffset.UTC );

Duration duration = Duration.between ( start , now );
long totalSeconds = duration.getSeconds ();

转储到控制台。

System.out.println ( "start: " + start + " | now: " + now + " | duration: " + duration + " | totalSeconds: " + totalSeconds );
  

开始:2015-01-01T00:00Z |现在:2016-07-24T04:15:57.345Z |持续时间:PT13684H15M57.345S | totalSeconds:49263357

转向另一个方向,从起点开始计算一个日期时间很简单。只需致电plusSeconds

使用TimeUnit类,而不是用“魔术”数字和数学计算弄脏你的代码以获得几秒钟。

OffsetDateTime start = OffsetDateTime.of ( 2015 , 1 , 1 , 0 , 0 , 0 , 0 , ZoneOffset.UTC );
long seconds = TimeUnit.HOURS.toSeconds ( 7 );  // Let `TimeUnit` class do the math of calculating seconds.
OffsetDateTime stop = start.plusSeconds ( seconds );
  

2015-01-01T07:00Z