我正在寻找将毫秒存储为“long”时向毫秒添加毫秒的最佳方法。 Java日历有一个 add 函数,但它只需要一个'int'作为数量。
这是我提出的一个解决方案......
Calendar now = Calendar.getInstance();
Calendar timeout = Calendar.getInstance();
timeout.setTime(token.getCreatedOn());
timeout.setTimeInMillis(timeout.getTimeInMillis() + token.getExpiresIn());
还有其他建议吗?
答案 0 :(得分:22)
实际上,您的解决方案对我来说几乎很好。当我没有正确考虑Date
和getTimeInMillis
时,我最初通过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.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.time
,Trail: Date Time*。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How 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(格林威治标准时间),只使用日期作为表示层。即。如果要将日期转换为文本。