我知道标准的UNIX纪元时间是1/1/70,我可以使用这个变量将当前时间转换为UNIX时间:
int time =(int)((System.currentTimeMillis())/ 1000);
(注意:我知道它通常存储为64位长,但我需要它为32位,因此转换为int)。
我的问题是 - 在Java中是否有任何内置方法,您可以将其作为"纪元日期传递给另一个日期。"我想要得到的是一个特定日期以来的秒数的时间戳。即我想将2015年1月1日定义为MY epoch。然后每个未来日期将是自2015年1月1日以来的秒数。
如果没有提供该功能的Java库,那么有关如何执行此操作的任何想法? 谢谢, 添
答案 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)
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 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date
,.Calendar
和& java.text.SimpleDateFormat
。 Joda-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