2017-06-01 41 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,這個答案解決了我的問題。代碼比我的清晰簡單。再次感謝。 –