Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java日历。。。对于两个不同的值,我得到相同的结果_Java_Calendar - Fatal编程技术网

Java日历。。。对于两个不同的值,我得到相同的结果

Java日历。。。对于两个不同的值,我得到相同的结果,java,calendar,Java,Calendar,这段代码计算从现在到日期之间的天数。 然而,我在3月8日和3月9日得到了相同的结果。 请帮忙! 先谢谢你 更详细的源代码示例,由Basil Bourque编写 Calendar cal=Calendar.getInstance(); long nowInMillis=cal.getTimeInMillis(); 校准设置(2014年,日历3月8日);//2014年3月8日//年、月、日 长征2014年8月; 校准设置(2014年,日历3月9日);//2014年3月9日//年、月、日 长征201

这段代码计算从现在到日期之间的天数。 然而,我在3月8日和3月9日得到了相同的结果。 请帮忙! 先谢谢你


更详细的源代码示例,由Basil Bourque编写

Calendar cal=Calendar.getInstance();
long nowInMillis=cal.getTimeInMillis();
校准设置(2014年,日历3月8日);//2014年3月8日//年、月、日
长征2014年8月;
校准设置(2014年,日历3月9日);//2014年3月9日//年、月、日
长征2014;
长日第8天=(2014年3月8日-现在的百万分之一)/(1000*24*60*60);
长日第9日=(2014年3月9日-现在的百万分之一)/(1000*24*60*60);
System.out.println(((2014年3月8日-现在的毫秒)以人工天数表示:“+daysTil8th+”,以毫秒表示:“+(2014年3月8日-现在的毫秒));
System.out.println(((2014年3月9日-现在的毫秒)以人工天数表示:“+daysTil9th+”,以毫秒表示:“+(2014年3月9日-现在的毫秒));
System.out.println(“(2014年3月9日-现在-现在)-2014年3月8日-现在):”+((2014年3月9日-现在-现在)-2014年3月8日);
System.out.println(“((2014年3月9日-现在-现在)-2014年3月8日-现在-现在]/(1000*60*60):”+((2014年3月9日-现在-现在)-2014年3月8日-现在)/(1000*60*60));
当2013-11-20T17:35:01.119-08:00(太平洋标准时间)在西雅图、Java 7、Mac OS X 10.8.5上运行时

(2014年3月8日)人工天数:108,毫秒:933120000
(2014年3月9日)人工天数:108,毫秒:9414000000
(2014年3月9日-现在)-(2014年3月8日-现在):82800000
(2014年3月9日-2014年3月8日-2014年3月24日)/(1000*60*60):23
注:对于我的时区,从2014年3月9日星期日凌晨2:00开始


问题:为什么在上面的两行输出中都有
108
?答案是DST,但具体如何?

2014年3月9日是DST转换的日子。因此,计算是正确的,3月9日的差值是108天23小时,这四舍五入为108天。

正如Jim Garrison在中所说,基于整数的数学
(1000*24*60*60)
假设一天24小时。对于我们这些生活在一个不合理的(DST)实践时区的人来说,情况并非如此。美国时区的8号和9号之间是23小时,而不是24小时

经验教训:

  • 永远不要自己计算日期和时间
  • 切勿使用java中捆绑的java.util.Date和.Calendar
  • 总是使用一个像样的库,比如Java8中的或新的
在Java7中,JodaTime2.3解决了同样的问题,并且输出正确

    Calendar cal = Calendar.getInstance();
    long now = cal.getTimeInMillis();
    int year = 2014;
    int month = 3;
    int date = 8;
    cal.set(year, month - 1, date);
    long dday = cal.getTimeInMillis();
    long count = (dday - now) / (1000 * 24 * 60 * 60);
    System.out.println((dday - now));
    System.out.println(count);
当运行时

现在在《美国/洛杉矶》(太平洋标准时间):2013-11-20T18:25:06.424-08:00
截止日期2014-03-08T14:00:00.000-08:00:107
截止日期2014-03-09T21:00:00.000-07:00:109
截至2014年3月8日的天数:107
截至2014年3月9日的天数:108

注意:一天中的时间会影响天数。请注意107和109与107和108,两天的差异与一天的差异。

哪两个值相同?我运行了你的代码,但没有看到任何相同的值。我在Eclipse上运行了这段代码,3月8日和3月9日都有108天。@user3015561:你的时间大约是午夜,不是吗?@jeroenvanevel我在下午3点左右试过。我只是再试了一次,但得到了相同的结果。检查cal.getTimeInMillis()是否获取了正确的日期。是什么原因导致他的计算结果与我的本地代码相同的计算结果之间存在差异?3月9日的计算结果都是108。3月8日为107。他两次都得了108分。这怎么可能呢?我也看到了问题:在西雅图,我两个都拿到108分。请参阅问题后附加的源代码。答案是夏令时,但我不确定具体如何。日历课使用一天中的什么时间?关于你的问题,请参阅我修订的代码。23小时的差异一定意味着DST的发生。最初编写代码的方式是两个日期的时间完全相同,大约是1700 CST。由于DST在3月9日凌晨2点开始,因此3月9日1700小时代表从第一个时间戳开始的108天23小时。整数除法的截断导致结果为108。
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.

// Using US west coast time zone because March 9, 2014 at 02:00 is the start of DST Daylight Saving Time.
org.joda.time.DateTimeZone californiaTimeZone = org.joda.time.DateTimeZone.forID("America/Los_Angeles");

org.joda.time.DateTime now = new org.joda.time.DateTime(californiaTimeZone);

// Note the arbitrary choice of times (14 & 21 hours) assigned to new DateTimes.
org.joda.time.DateTime march_8_2014 = new org.joda.time.DateTime( 2014, 3, 8, 14, 0);
org.joda.time.DateTime march_9_2014 = new org.joda.time.DateTime( 2014, 3, 9, 21, 0);

int daysUntil8th = org.joda.time.Days.daysBetween( now , march_8_2014 ).getDays();
int daysUntil9th = org.joda.time.Days.daysBetween( now , march_9_2014 ).getDays();

// If you want whole days, call 'withTimeAtStartOfDate()' method.
// Don't get clever with trying to set a midnight time. Not every day in every time zone has a midnight.
int daysUntil8thStarts = org.joda.time.Days.daysBetween( now , march_8_2014.withTimeAtStartOfDay() ).getDays();
int daysUntil9thStarts = org.joda.time.Days.daysBetween( now , march_9_2014.withTimeAtStartOfDay() ).getDays();

System.out.println("Now in 'America/Los_Angeles' (Pacific Standard Time): " + now );

System.out.println("Days until " +  march_8_2014 + ": " + daysUntil8th );
System.out.println("Days until " + march_9_2014 + ": " + daysUntil9th );

System.out.println("Days until March 8, 2014 starts: " + daysUntil8thStarts );
System.out.println("Days until March 9, 2014 starts: " + daysUntil9thStarts );