当毫秒很长时,为Java日期添加毫秒

时间:2010-08-10 21:28:27

标签: java datetime date

我正在寻找将毫秒存储为“long”时向毫秒添加毫秒的最佳方法。 Java日历有一个 add 函数,但它只需要一个'int'作为数量。

这是我提出的一个解决方案......

Calendar now = Calendar.getInstance();
Calendar timeout = Calendar.getInstance();

timeout.setTime(token.getCreatedOn());
timeout.setTimeInMillis(timeout.getTimeInMillis() + token.getExpiresIn());

还有其他建议吗?

4 个答案:

答案 0 :(得分:22)

实际上,您的解决方案对我来说几乎很好。当我没有正确考虑DategetTimeInMillis时,我最初通过setTimeInMillis发布了答案。

但是,您正在调用setTime然后 setTimeInMillis这对我来说似乎有些多余。您的代码看起来与此相同:

Calendar timeout = Calendar.getInstance();
timeout.setTimeInMillis(token.getCreatedOn().getTime() + token.getExpiresIn());

一个更好的替代方案是使用Joda Time但它通常是很多更好的日期/时间API。

答案 1 :(得分:17)

您还可以创建一个日期,其中包含当前本地日期加上您需要添加为过期时间的毫秒数

import java.util.Date;

long expiremilis = 60000l; //  1 minute
// Expires in one minute from now
Date expireDate = new Date(System.currentTimeMillis() + expiremilis);

或与日历相同

long expiremilis = 60000l; // 1 minute
Calendar expireDate= Calendar.getInstance();
// Expires on one minute from now
expireDate.setTimeInMillis(System.currentTimeMillis() + expiremilis);

如果您使用现有的Date对象,则可以执行以下操作:

import java.util.Date;

long expiremilis = 60000l; // 1 minute
// Expires on one minute from the date object date
Date expireDate = new Date(myDate.getTime() + expiremilis);

使用现有的日历对象

long expiremilis = 60000l; // 1 minute
Calendar expireDate= Calendar.getInstance();
// Expires on one minute from the calendar date
expireDate.setTimeInMillis(myCalendar.getTimeInMillis() + expiremilis);

答案 2 :(得分:3)

java.time

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*

使用现代 API java.time 的演示:

import java.time.Instant;

public class Main {
    public static void main(String[] args) {
        Instant createdOn = Instant.ofEpochMilli(1_622_800_000_000L);
        System.out.println(createdOn);

        Instant timeout = createdOn.plusMillis(50_000L);
        System.out.println(timeout);
    }
}

看到这个code run live at IdeOne.com

输出:

2021-06-04T09:46:40Z
2021-06-04T09:47:30Z

Instant 表示 UTC 中时间线上的一个瞬时点。输出中的 Z 是零时区偏移的 timezone designator。它代表祖鲁语并指定 Etc/UTC 时区(时区偏移为 +00:00 小时)。

因此,问题的解决方案是:

Instant createdOn = token.getCreatedOn().toInstant();
Instant timeout = createdOn.plusMillis(token.getExpiresIn());

查看 Date#toInstant 的文档以了解更多相关信息。

modern Date-Time API 中详细了解 java.timeTrail: 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

答案 3 :(得分:1)

Calendar是一个相当昂贵的Date对象,它的功能并不是最好的。如果你想要一个多用途的Date对象,我建议你看一下JODA Time,它有一个你想要的功能。

但是,更简单的Java Date对象是Date类,如@Dubas所示。

对于您正在执行的操作类型,更简单的是使用long。这也快得多。

long timeoutMS = token.getCreatedOn() + token.getExpiresIn(); 

我在所有日期使用long(格林威治标准时间),只使用日期作为表示层。即。如果要将日期转换为文本。