2017-06-01 91 views
0

我想计算亲属日期,这是从01/01/1957到给定日期有多少天不同。我需要同时处理夏令时。下面是代码:Java如何计算相对日期并同时处理夏令时?

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

但只得到默认时间由系统。我的问题是我如何检查给定的日期是夏时制日期,然后做计算部分。我正在使用新西兰时区。谢谢。

+0

你可以使用Java 8和'java.time.ZonedDateTime'类? – ngreen

+0

不完全清楚你想要做什么,但它似乎太复杂。只需使用相应的正确时区将起始末端转换为“日期”,然后计算差异。 – Henry

回答

0

您不应该手动进行计算,而应该尝试利用java.time的内置API,这些API易于使用并为您处理DST。 参见:https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html#until-java.time.temporal.Temporal-java.time.temporal.TemporalUnit-

下面的代码应该帮助你和你正在尝试做的计算:

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

非常感谢Pallavi,这个答案解决了我的问题。代码比我的清晰简单。再次感谢。 –