繁体   English   中英

在Java中使用不同的日期作为UNIX时代?

[英]Use different date as UNIX epoch time in Java?

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

int时间=(int)((System.currentTimeMillis())/ 1000);

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

我的问题是-Java中是否有任何内置方法,您可以在其中传递不同的日期作为“时期”。 我要获取的是自特定日期以来#秒的时间戳。 即我想将2015年1月1日定义为我的时代。 那么每个未来的日期将是自2015年1月1日以来的秒数。

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

不需要库,您只需要使用数学即可。

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

您可能必须滚动自己的时间和日期方法,这将基本上重新包装标准方法,同时将相应的秒数减去正确的秒数,以得出新的纪元。

所以,也许像

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;
    }
}

TL;博士

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

经过时间

忘记时代参考日期 您想要的只是经过的时间。

java.time

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

要了解更多信息,请参见Oracle教程 并在Stack Overflow中搜索许多示例和说明。

多的java.time功能后移植到Java 6和7在ThreeTen-反向移植并且还适于在到Android ThreeTenABP

时区

您的问题未能解决时区这一关键问题。

既然您提到了Unix风格的时间,我将假设您打算使用UTC时区。 Instant类以UTC表示时间轴上的时刻,分辨率最高为纳秒。 为了获得更大的灵活性,包括设置格式,请使用OffsetDateTime和指定的UTC偏移量。

Duration

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

Duration类将Duration跨度表示为总秒数,以秒为单位,以纳秒为单位。 我们可以从我们的OffsetDateTime对象对中获取一个Duration对象。

调用Duration::getSeconds获取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 | 总计秒:49263357

换个方向,从您的起点算起几秒钟的日期时间很容易。 只需致电plusSeconds

使用TimeUnit类,而不是使用“魔术”数字和数学计算来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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM