将月转换为毫秒的最佳方法



我正在尝试将几个月转换为毫秒

例如: 6 个月 = X 毫秒

这个问题没有固定的答案,因为它取决于它们是哪个月份 - 实际上是哪一年。如果您想考虑到这一点,也可能是您所在的时区。(顺便说一下,我假设你的意思是公历 - 不同的日历系统有不同的月份长度。

你可以通过假设一年中有 365.25 天来获得某种"合理的近似值",并说 6 个月是其中的一半,然后以毫秒为单位找出很多天。但这只是一个近似值。

对于"从日期/时间 X 到 6 个月后需要多少毫秒",您将使用 API(即使Calendar也适用于这种特殊情况,尽管我建议使用 Joda Time 或 Java 8 中的 java.time):

  • 在适当的日历和时区中设置开始日期/时间
  • 获取"自Unix时代以来的毫秒数"(在任何API中都很容易检索)并记住它
  • 添加 6 个月
  • 再次获取"自Unix纪元以来的毫秒数",并从中减去较早的值

如果您确切知道这 6 个月的时间到何时到达,您可以使用多种方法来计算持续时间,使用 java.util.Calendar 、JodaTime 或 JDK1.8 时间 API。

但是,如果您没有特定的日期,则可以为一个月计算平均持续时间。世界上没有任何 API 可以改变这一事实。

例如,JDK1.8 时间 API 在一个月的持续时间内使用它(以秒为单位):(从 java.time.temporal.ChronoUnit 开始)

MONTHS("Months", Duration.ofSeconds(31556952L / 12)),

31,556,952是一年中的秒数,基于持续 365.2425 天的一年。

您可以直接使用相同的数字并获得与时间 API 相同的结果:

long months = 6;
long seconds = months * 31556952L / 12;
long milliseconds = seconds * 1000;

结果:

15,778,476,000
Calendar today = Calendar.getInstance();
Calendar sixMonthsAhead = Calendar.getInstance();
sixMonthsAhead.add(Calendar.MONTH, 6);
long differenceInMilis = sixMonthsAhead.getTimeInMillis() - today.getTimeInMillis();

您也可以使用...

sixMonthsAhead.add(Calendar.DATE, 180); 
// or 183 days because 365 / 2 is approximately 183.

而不是。。。

sixMonthsAhead.add(Calendar.MONTH, 6);

以获得更准确的结果。但就像乔恩提到的,它总是会根据一年中的哪一天而有所不同。

Jon Skeet的回答是正确的。

乔达时间

假设您可以在时间线上指定一对起点和终点,下面是一些使用 Joda-Time 2.3 库的示例代码。

此代码抓取当前时刻,调整为每月的第一天,并调整为当天的第一个时刻。然后它增加了 6 个月。Joda-Time 很聪明地添加了月份,考虑到闰年和各种长度的月份。然后将此 6 个月的跨度表示为Interval实例。由此我们计算毫秒数。请注意,毫秒计数需要是long(64 位)而不是我们 Java 程序员更常用的int(32 位)。最后,为了好玩,我们看看当以ISO 8601标准的"持续时间"格式格式化时,这个时间跨度是什么样子的。

DateTimeZone dateTimeZone = DateTimeZone.forID( "Europe/Paris" ); // Better to specify a time zone than rely on JVM’s default.
DateTime start = new DateTime( dateTimeZone ).withDayOfMonth( 1 ).withTimeAtStartOfDay();
DateTime stop = start.plusMonths( 6 );
Interval interval = new Interval( start, stop );
long milliseconds = interval.toDurationMillis(); // A long, not an int.
Period period = interval.toPeriod();  // For fun… ISO 8601 standard's Duration format.

转储到控制台...

System.out.println("start: " + start );
System.out.println("stop: " + stop );
System.out.println("interval: " + interval );
System.out.println("milliseconds: " + milliseconds );
System.out.println("period: " + period );

运行时...

start: 2014-04-01T00:00:00.000+02:00
stop: 2014-10-01T00:00:00.000+02:00
interval: 2014-04-01T00:00:00.000+02:00/2014-10-01T00:00:00.000+02:00
milliseconds: 15811200000
period: P6M

相关内容

  • 没有找到相关文章

最新更新