我正在尝试将几个月转换为毫秒
例如: 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