当前位置: 首页 > 知识库问答 >
问题:

Calender.GetTimeInMilis()方法在不同位置返回不同的值

昌学
2023-03-14

在我的应用程序中,有一个计算得到两个日期之间的天数。计算如下所示;

private int getDateDiff(Date currentDate, Date previousDate){
        Calendar currDateCal = Calendar.getInstance();
        currDateCal.clear();
        currDateCal.setTime(currentDate);

        Calendar previousDateCal = Calendar.getInstance();
        previousDateCal.clear();
        previousDateCal.setTime(previousDate);

        long milisecond1 = currDateCal.getTimeInMillis();
        long milisecond2 = previousDateCal.getTimeInMillis();

        // Find date difference in milliseconds
        long diffInMSec = milisecond1 - milisecond2;

        // Find date difference in days
        // (24 hours 60 minutes 60 seconds 1000 millisecond)
        long diffOfDays = diffInMSec / (24 * 60 * 60 * 1000);

        return (int)diffOfDays;
    }

此方法在我的本地pc(windows 7,64位)上返回正确的值(即2015-03-10 00:00:00.0、2015-03-02 00:00:00.0,从存储库中检索的值为8,并传递给该方法)。但是,此方法在位于加拿大的pc(Windows 7,64位)上返回不正确的值(即2015-03-10 00:00:00.0、2015-03-02 00:00:00.0的值为7

本地PC上使用的JDK信息是;

java版本“1.7.0”
java(TM)SE运行时环境(build 1.7.0-B147)
java HotSpot(TM)64位服务器VM(build 21.0-B17,混合模式)

加拿大PC上使用的JDK信息是;

java版本“1.7.0_17”
java(TM)SE运行时环境(build 1.7.0_17-B02)
java HotSpot(TM)客户端VM(build 23.7-B01,混合模式,共享)

我就知道;

1)类日期/时间戳代表特定的时间瞬间,自1970年1月1日00:00:00 GMT以来的精度为毫秒,因此这个时间差(从历元到当前时间)在世界各地的所有计算机中都是相同的,与时区无关。
2)它不知道给定的时间是在哪个时区。
3)如果我们想要基于时区的时间,我们应该使用Calendar或Java中的SimpleDateFormat。
4)如果您尝试打印日期/时间戳对象(到字符串),它将转换并打印您计算机的默认时区的时间。
5)所以我们可以说(日期/时间戳)。getTime()对象将始终具有UTC(以毫秒为单位的时间)
6)结束日期。getTime()将给出UTC时间。但toString()是在区域设置特定的时区上,而不是UTC。

有人认为这个计算有问题吗?我被困在这了。

共有1个答案

端木皓君
2023-03-14

正如您所发现的那样,手工计算与日期相关的事情很容易出错。DST于今年3月8日在加拿大开始,所以当你的日期的时区在该国时,你就少了一个小时。我怀疑您的其他位置没有DST变化,或者它发生在不同的一天(例如在英国发生在3月29日)。

您应该使用内置方法计算两个日期之间经过的天数。这可以通过Calendar类来完成,但使用新的Java time API(Java8+)或joda time可能会省去一些头疼的问题。例如使用Java8:

ZonedDateTime start = LocalDate.of(2015, 3, 2).atStartOfDay(UTC);
ZonedDateTime end = LocalDate.of(2015, 3, 10).atStartOfDay(UTC);
long days = DAYS.between(start, end); //8
 类似资料:
  • 我试图解决一个问题,我必须在搜索中得到明确的结果。 当我对最喜欢的汽车“法拉利”执行术语查询时。我得到两个名为ABC的结果。在这种情况下,我只是希望返回的结果应该是一个。所以我的要求是,如果我可以应用一个不同的on name字段来接收一个1结果。 谢啦

  • 问题内容: 在IE7,IE8和Firefox上设置属性并返回不同的值: IE 8: IE 7: 火狐: 为什么存在这种差异? 在不使用jQuery的情况下,是否存在跨不同浏览器(IE8,IE7,Firefox)一致的等效属性? 问题答案: 这与浏览器的盒子模型有关。使用jQuery或其他JavaScript抽象库之类的东西来规范DOM模型。

  • 我可以看到它不工作,因为我尝试了它。我只是无法解释为什么一定要这样。 第二个方法来自一个类,该类是实现第一个getValue()方法的类的子类。 为什么同名不足以覆盖该方法?我想到的唯一论点是,它将反对“是一个”关系,因为用A扩展的第二个方法的类必须具有与A相同的能力,如果你重写返回类型,你就打破了那个法律,对吧?

  • 我在应用程序中编写了以下代码。 它在“asp.net核心”和“标准”框架中有不同的行为。 框架 4.7:如果我在 .net 标准框架中创建的网站/控制台应用程序中使用此代码,它总是给我相同的结果。哈希码变量的值始终为“1066337973”。 Asp.net核心:如果我将在ASP.NET核心网站使用这段代码,那么每次我停止应用程序并重新启动时,hashcode变量都有不同的值。 由于这个问题,我的

  • 我正在尝试实现和重写具有不同返回类型的方法,而不会被迫转换返回类型。 我的问题:是否可以在不强制强制转换的情况下返回不同的类型?解决这个问题的抽象方法看起来怎么样? 我认为必须有一个解决方案,因为编译器应该知道返回类型...

  • 假设我有一个Employee类,它具有正确重写的equals和hashcode方法。 测试类如下所示 上述程序的输出为: 员工[ENO=1,FirstName=Karan,LastName=Mehara] 为什么distinct()方法返回重复的元素? 根据employee类的equals()和hashcode()方法,这两个对象是相同的。