Java如何计算相对日期并同时处理夏令时?

Java如何计算相对日期并同时处理夏令时?,java,Java,我想计算亲属日期,即从1957年1月1日到给定日期的天数差。我需要同时处理日光节约。代码如下: public String convertToRelative(String endDate) throws ParseException { String relativeDate; String baseDate = "19570101"; boolean isDST = TimeZone.getDefault().inDaylightTime(new java.util

我想计算亲属日期,即从1957年1月1日到给定日期的天数差。我需要同时处理日光节约。代码如下:

public String convertToRelative(String endDate) throws ParseException {

    String relativeDate;
    String baseDate = "19570101";
    boolean isDST = TimeZone.getDefault().inDaylightTime(new java.util.Date());

    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

    Calendar cal = Calendar.getInstance();

    cal.setTime(sdf.parse(baseDate));

    long time1 = cal.getTimeInMillis();

    cal.setTime(sdf.parse(endDate));

    long time2 = cal.getTimeInMillis();


    if ( isDST ) {

        long between_days = (time2 - time1 - 3600000)/(1000*3600*24);

        int relative = Integer.parseInt(String.valueOf(between_days));

        relativeDate = String.valueOf(relative + 1);

    } else {

        long between_days = (time2 - time1)/(1000*3600*24);

        int relative = Integer.parseInt(String.valueOf(between_days));

        relativeDate = String.valueOf(relative + 1);

    }

    return relativeDate;

}
从代码中,您可以看到我检查的时间是否为夏令时:

boolean isDST = TimeZone.getDefault().inDaylightTime(new java.util.Date());

但它只从系统获取默认时间。我的问题是如何先检查给定日期是否为夏令时日期,然后再进行计算部分。我用的是新西兰时区。谢谢。

与手动计算不同,您应该尝试利用
java.time
的内置API,该API易于使用并为您提供DST。 参考:

以下代码应该可以帮助您完成正在尝试执行的计算:

ZoneId auckZone = ZoneId.of("Pacific/Auckland");
LocalDateTime base = LocalDate.of(1957, 01, 01).atStartOfDay();
ZonedDateTime baseDate = base.atZone(auckZone);
ZonedDateTime endDate = LocalDate.parse(endDt, DateTimeFormatter.ofPattern("yyyyMMdd")).atStartOfDay().atZone(auckZone);
System.out.println(baseDate.until(endDate, ChronoUnit.DAYS));

你能使用Java8和
Java.time.ZonedDateTime
类吗?不太清楚你想做什么,但看起来太复杂了。只需使用相应的正确时区将开始-结束转换为日期,然后计算差值。非常感谢Pallavi,这个答案解决了我的问题。代码比我的要清晰和简单得多。再次感谢。