从当前纪元时间往后增加 30 天 Java

Add 30 days in future from current epoch time Java

我正在获取纪元中的当前时间。我怎样才能在未来增加 1 个月?

Date date = new Date();
int epoch = date.getTime();

纪元的数据类型 - 整数($int64)

准确地说:我想从当前时间开始增加 30 天。

我正在使用允许嵌入 Groovy 和 Java 代码的工具。我使用 Date class 因为我可以轻松地 import java.text.DateFormat;import java.text.SimpleDateFormat;。我的工具不支持 Instant.

这是我的做法:

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, 30);
long epoch = calendar.getTimeInMillis();
System.out.println(epoch);

结果:

1606785580218

这是毫秒。您可以除以 1000 以秒为单位得到版本。注意:秒版本将适合 int 而毫秒版本需要很长。所以如果你想要 int:

中的秒版本,这样做是可以的
long epoch = ...
int epochSeconds = (int)(epoch / 1000);

顺便说一句,Unix 时间(大纪元时间,POSIX 时间)定义为自 1970 年 1 月 1 日 UTC 以来的秒数。某些系统将 return 以毫秒为单位的值以提供更高的准确性,但这样的值正式是小数纪元时间乘以 1000。

你不想使用Date,使用日期时间API。

Instant.now().plus(30, ChronoUnit.DAYS)

从Java8开始,使用java.time时间用量

作为纪元秒,加上 30 天:

Instant.now().plus(30, ChronoUnit.DAYS).getEpochSecond()

作为纪元毫秒,加上 30 天:

Instant.now().plus(30, ChronoUnit.DAYS).toEpochMilli()

到目前为止所有答案都是错误的。

那是因为你想要的不可能.

你在混合完全不兼容的概念。您要添加 1 个没有时区和政治意义的实体('epoch-millis',明确表示:没有时区信息!),除非您提供时区和时代,否则无法确定其含义是什么特别的概念.

您不能将一个月添加到纪元毫。不是因为 java 不允许,也不是因为它很难编程。你不能这样做的原因与你不能指向圆圈的角落一样。根据定义,字面上不可能。

'epoch millis' 是一个从根本上讲时间的概念。 'when the sun flared up' 之类的东西。 “刚才拍手的时候”。这个概念在 java 中通过 java.time.Instant 的实例得到了最好的体现。它也由 java.util.Date 表示,这很有趣,因为这与 Date 完全不同,事实上,j.u.Date 是一个完全愚蠢的名字,作者很晚才意识到这一点,这就是为什么 (几乎)它拥有的所有方法都被标记为 @Deprecated,并附有注释,说明 Date 的名字完全是一个谎言。 j.u.Date不代表日期.

一个月,这是一个完全不同的蠕虫罐头。一个月左右没什么稳定。可能是28天。 30天。 31天。 30 天又多了一秒钟。可能是一个根本不存在的月份,或者只有 11 天(当政治区域切换时区时,您可能会发生一些非常奇怪的事情)。

那么,如何将 'a month' 添加到任何时刻?

你不能。这是不可能的。你不知道要添加什么,因为没有办法弄清楚是 28 天、29 日、30 日、31 日,更不用说闰秒和时代怪异了(最近,萨摩亚切换到日期变更线的另一边,并且因此,他们的 12 月只有 30 天。将共产主义引入俄罗斯的著名 'october revolution' 发生在 11 月 ,至少在整个世界(除了俄罗斯人)很担心,因为只有俄罗斯人在儒略历上仍然是十月。作为整个 'communism will take over the world!' 计划的一部分,他们做的第一件事就是与世界其他地方一样使用公历,因此,这个日期 在俄罗斯历史上根本不存在 :1918 年 2 月 1 日至 13 日。他们只是..被跳过了。有一天你在莫斯科醒来,走路在外面,问某人:嘿,今天是几号(虽然可能是俄语),他们说:为什么,1 月 31 日,同志。第二天你重复这个练习,现在是 2 月 19 日。所以,二月俄罗斯的 ary 1918 有 15 天.

明白为什么 'please add 1 month' 不是一件可能完成的事情,除非你告诉我何时何地?如果你告诉我'in russia',那我还是不知道加15,还是31,还是30,还是29,还是28。如果你告诉我'Februari, in 1918',好吧,剩下的世界,二月是二十八天。只有在俄罗斯是 15。

现在,将 'a month' 添加到某些 human-oriented date/time 构造中,例如 'well, right now, in amsterdam',啊,这有效:“这个月,现在是这个月, in amsterdam”,这是一个有答案的问题。但是,'epoch millis' 是 java-ese 用于:“瞬间,没有任何和所有地理信息”,并且由于缺少地理信息,也无法知道相对于任何时区的时间,并且因此,完全不可能。

那么,你能做什么?好吧,很多事情,但首先你需要弄清楚你想做什么,然后才会有人告诉你怎么做:

  • 我只想添加平均月份,最后得到 epoch-millis。好吧,然后加上 2.629.800.000,这是一个粗略的估计(大约 30.4375 天,大致是一个月的平均长度。我不知道这会起到什么作用,但这肯定是一个比添加 30 天,或 31 天,或 28 天。
  • 我想先将这个 epoch-millis 翻译成人类所说的时间(年、月、日、小时、分钟和秒),然后将月份值增加1,并保留它,例如一个 ZonedDateTime 对象。好的,那么首先弄清楚你想要哪个时区,然后把你的 epoch-millis 变成 ZonedDateTime,然后我们就到了 'add a month to this please' 甚至有意义的地步,所以现在我们可以这样做:.plusMonths(1),瞧。
  • 与之前相同,但随后将其转换回纪元毫秒。好吧,做同样的事情,最后调用 .toInstant(),然后调用 toEpochMillis()

大多数其他想法归结为:你的问题没有意义,无法回答。

注意:以上都使用了 java.time 包。所有其他选项(java.util.Datejava.util.Calendar 都损坏且笨拙;通常尝试在这些 API 中执行此操作或任何其他 date-related 工作要么是不可能的,会给出错误的答案,要么是一种方法,但很难弄清楚如何以及生成的代码将很难维护和难以遵循。你为什么要主动打自己的脸?为什么你会自愿使用垃圾 API?不要那样做。