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

Java日历的日光节约问题

丌官皓君
2023-03-14

这是关于Java日历,以及我们今天在多伦多的日光节约变化后遇到的影响。

下面是代码

    Date date = new Date(); //Sun Mar 11 00:00:00 EST 2018
    Integer time = 349;

    Calendar scheduleDateCal = Calendar.getInstance();
    scheduleDateCal.setTime(date);

    scheduleDateCal.set(Calendar.MINUTE, 0);
    scheduleDateCal.set(Calendar.HOUR_OF_DAY, 0);
    String strSchAdminTime = String.valueOf(time);
    Integer schAdminMinute = time;

    if (strSchAdminTime.length() >= 2) {
        schAdminMinute = Integer.valueOf(strSchAdminTime.substring(strSchAdminTime.length()-2));
    } 
    if(time>60){
        Integer schAdminHour = Integer.valueOf(strSchAdminTime.substring(0,strSchAdminTime.length()-2));
        scheduleDateCal.add(Calendar.HOUR_OF_DAY, schAdminHour);
    }else{
        scheduleDateCal.add(Calendar.HOUR_OF_DAY, 0);
    }
    scheduleDateCal.add(Calendar.MINUTE, schAdminMinute);

    System.out.println(scheduleDateCal.getTime());

我知道这段代码没有达到最佳实践,但是我需要在当前版本中维护它。在这里,它使用整数来表示时间部分,然后有一个逻辑来从中提取小时和分钟。

当我遵循逻辑时,小时部分是3。然后,有一个逻辑将此时间添加到值为“Sun Mar 11 00:00:00 EST 2018”的Calendar对象中,并使用下面的语句

scheduleDateCal.add(Calendar.HOUR_OF_DAY, schAdminHour);

理论上,在计算之后,日历对象的值应为“Sun Mar 11 03:00:00 EDT 2018”。但是它返回“Sun Mar 11 04:00:00 EDT 2018”,我知道从今天开始,夏令时将提前一个小时。有谁能帮我理解这一点吗

谢谢你的帮助。

共有2个答案

严信瑞
2023-03-14

EST为-5,EDT为-4,因此调用add()时获得1小时。如果需要在不同的时区产生结果,可以使用SchduleDateCal.set(Calendar.HOUR_OF_DAY, schAdmin小时)SchduleDateCal.set(Calendar. MINUTE, schAdminute)

令狐良骏
2023-03-14

今天00:00:00(2018年3月11日星期日)的夏季时间(DST)尚未生效,因此该时间被正确地渲染为2018年3月11日太阳00:00:00东部标准时间(东部标准时间)<代码>日期。toString根据日期对象中包含的时间(而不是调用toString方法的时间)在EST和EDT之间进行选择。当你在这个时间上加上3个小时,你就在2时跨越了这个时间,当时钟被调到了3。因此,在开始时间3小时后,时间是美国东部夏令时04:00:00(东部夏令时)。

PS如果您或其他人感兴趣,这里是您的代码的现代版本,既简单又简短。要将时间设置为03:49:

    int time = 349;
    ZoneId zone = ZoneId.of("America/Toronto");
    ZonedDateTime scheduledDateTime = LocalDate.now(zone)
            .atTime(time / 100, time % 100)
            .atZone(zone);
    System.out.println(scheduledDateTime);

今天这个印了

2018-03-11T03:49-04:00[美国/多伦多]

当然,如果你能完全摆脱将03:49表示为整数值349,那就更好了。要使用JVM的时区设置,可以将zone设置为ZoneId。systemDefault()。这很脆弱,因为程序的其他部分或运行在同一JVM中的其他程序可能随时更改设置。

将时间设置为午夜后3小时49分钟(如您所见,与DST转换不同):

    ZonedDateTime scheduledDateTime = LocalDate.now(zone)
            .atStartOfDay(zone)
            .plusHours(time / 100)
            .plusMinutes(time % 100);

这次我得到了

2018-03-11T04:49-04:00[美国/多伦多]

 类似资料:
  • 我想知道如何使用Moment. JS计算一天的小时数。原因是正常的一天是24小时。但是夏令时从Spring开始的那一天将是25小时。 或者我如何利用这个时刻。js甚至js来计算是否已达到Spring夏令时,记住DST在2a之后开始。M 我尝试使用的代码是 时刻([2017,2,12])。isDST(); 然而,我如何使用它,使它不仅能告诉我它的DST,而且还能检查它是否在凌晨2点以后。

  • 我得到一个日历实例 在一个移动显示周六为周末而在另一个它显示周日为周末两个设备的时区是相同的 如果我将日历实例区域设置为美国或任何其他国家/地区,它可以完美运行。但我不希望它是恒定的。我希望它是区域性的,但在所有设备上都是一致的 如果时区相同,我希望两台设备上的周末都一样

  • 问题内容: 我正在尝试获取特定时区的当前时间。我尝试了以下代码。 我得到的答案令人惊讶-16:57-错了1个小时tz.getRawOffset()-7000 3600000是-为什么亚利桑那州的夏令时是正确的?如何获得凤凰城或美国任何其他城市的正确挂钟时间? 问题答案: 亚利桑那州处于山区时区,但未遵守DST。如果您将时区指定为“ US / Mountain”,则计算机将应用Mountain时区中

  • 问题内容: 我有一个电影课,里面有开始日期,持续时间和结束日期。开始和停止日期是日期对象(私有日期startDate …)(这是一个分配,因此我无法更改),现在我想通过将持续时间(以分钟为单位)添加到startDate中来自动计算stopDate。 据我所知,不赞成使用Date的时间操作功能,因此是不好的做法,但另一方面,我看不到将Date对象转换为日历对象以操纵时间并将其重新转换为Date对象的

  • 我正在寻找确切的开始和结束日期根据我们的桌面日历,如果我给周,年作为输入。但是上面的代码给出的输出是2009年1月27日星期日。我知道这是因为按照我们的说法,一周的第一天默认是星期天,但我需要按照桌面日历

  • 只用我的日历ID工作得很好. en.thai#holiday@group.v3.calendar.google.com |en.th#holiday@group.v3.calendar.google.com | 请帮忙谢谢你 calenderId:“me”或“primary………..output:”所有事件列表“ 日历Id:en.th#holiday@group.v3.calendar.googl