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

cwe*_*ton 19 java datetime date

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

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

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

timeout.setTime(token.getCreatedOn());
timeout.setTimeInMillis(timeout.getTimeInMillis() + token.getExpiresIn());
Run Code Online (Sandbox Code Playgroud)

还有其他建议吗?

Jon*_*eet 24

您的解决方案看起来几乎没什么问题,其实.我最初发布的答案通过去Date,当我还没有考虑getTimeInMillissetTimeInMillis顾及正常.

但是,你正在打电话setTime, setTimeInMillis对我来说似乎有些多余.您的代码看起来与此相同:

Calendar timeout = Calendar.getInstance();
timeout.setTimeInMillis(token.getCreatedOn().getTime() + token.getExpiresIn());
Run Code Online (Sandbox Code Playgroud)

通常一个更好的替代方法是使用约达时间虽然:)这通常是一个很大更好的日期/时间API.


Dub*_*bas 20

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

import java.util.Date;

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

或者与日历相同

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

如果使用现有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);
Run Code Online (Sandbox Code Playgroud)

并使用现有的Calendar对象

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


Arv*_*ash 5

java.time

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

java.time使用现代 API进行演示:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅在 IdeOne.com 上实时运行的代码

输出:

2021-06-04T09:46:40Z
2021-06-04T09:47:30Z
Run Code Online (Sandbox Code Playgroud)

An表示UTCInstant时间线上的瞬时点。输出中的 是零时区偏移的时区指示符。它代表祖鲁语并指定时区(具有小时的时区偏移量)。ZEtc/UTC+00:00

所以,你的问题的解决方案是:

Instant createdOn = token.getCreatedOn().toInstant();
Instant timeout = createdOn.plusMillis(token.getExpiresIn());
Run Code Online (Sandbox Code Playgroud)

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

Trail: Date Time中了解有关java.time现代日期时间 API *的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大多数java.time功能向后移植到 Java 6 和 7。如果您正在处理 Android 项目和 Android API level 仍然不符合 Java-8,请检查通过脱糖可用的 Java 8+ API以及如何在 Android 项目中使用 ThreeTenABP

  • 这是每个人都应该想要的答案。您可能想通过演示可以添加“50_000L”甚至“5_000_000_000L”来强调可以添加“long”值。 (2认同)