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
,当我还没有考虑getTimeInMillis
和setTimeInMillis
顾及正常.
但是,你正在打电话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)
日期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)
输出:
2021-06-04T09:46:40Z
2021-06-04T09:47:30Z
Run Code Online (Sandbox Code Playgroud)
An表示UTCInstant
时间线上的瞬时点。输出中的 是零时区偏移的时区指示符。它代表祖鲁语并指定时区(具有小时的时区偏移量)。Z
Etc/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。
归档时间: |
|
查看次数: |
60650 次 |
最近记录: |