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

时间:2014-04-05 08:27:47

标签: java datetime

我试图将几个月的时间转换为毫秒

例如:  6个月= X毫秒

4 个答案:

答案 0 :(得分:8)

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

你可以通过假设一年365.25天获得某种“合理的近似”,并说6个月是其中的一半,然后发现那么多天以毫秒为单位。但 只是近似值。

对于“从日期/时间X到6个月后需要多少毫秒”,您使用API​​(即使Calendar也适用于此特定情况,但我建议使用{{ Java 8中的3}}或java.time

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

答案 1 :(得分:5)

如果您确切知道这些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

答案 2 :(得分:2)

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);

获得更准确的结果。但就像乔恩提到的那样,它总是会根据一年中的哪一天而变化。

答案 3 :(得分:0)

answer by Jon Skeet是正确的。

约达时间

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

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

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