2016-01-24 60 views
0

此刻我正在嘗試使我的java程序重置一些值。重置這些值的觸發器將是新一天的開始。例如,如果日期是2015年1月24日,我打開該程序來完成我的工作並關閉程序。如果我在2015年1月24日打開該程序,它將不會重置程序。但是,如果我在2015年1月25日打開該程序,它將重置MySQL數據庫中的值。基於時間重置值MySQL

所以。如何對時間/日期進行驗證以重置數據庫中的值?

+0

Roy,你有一個想法,你將存儲你重置值的日期嗎?某處你將不得不堅持這個價值,並在稍後檢索它進行比較。也許屬性文件或表? –

+0

是的,我有一個值表,存儲我想要更改的值 –

+0

此表是否包含您更改值的日期?在你的例子中,這將存儲24/1/2015。 –

回答

0

使用getTodayAtMidnight()方法來計算下一個有效時間可以設定值。將此值存儲在表中。然後使用'now.after(nextSetDate)'來查看它是否返回'true'。如果是這樣,您可以重置值,並存儲下一個日期。如果它返回false,你仍然是在同一日期,不應該重置值。如果您有任何問題,請告訴我。

public static void main(String[] args) { 
    Date nextSetDate = getTodayAtMidnight(); 
    System.out.println(nextSetDate); 
    Date now = new Date(); 
    System.out.println(now.after(nextSetDate)); 
} 
public static Date getTodayAtMidnight() { 
     Calendar c = Calendar.getInstance(); 
     c.set(Calendar.HOUR_OF_DAY, 0); 
     c.set(Calendar.MINUTE, 0); 
     c.set(Calendar.SECOND, 0); 
     c.set(Calendar.MILLISECOND, 0); 
     c.add(Calendar.DAY_OF_YEAR, 1); 
     return c.getTime(); 
} 
+0

此代碼忽略了時區的關鍵問題。 JVM的當前默認時區已應用,但該默認值可能會有所不同 - 即使在運行時(!)也是如此。 –

+0

解決此問題的正確方法是什麼? –

+0

正確的做法是**始終指定時區**,而不是隱式依賴JVM的當前默認時區。 –

0

java.time使用與Java的早期版本中捆綁了名的麻煩舊日期,時間類

避免。使用Java 8及更高版本中內置的java.time框架。

在java.time,使用LocalDate類的日期,唯一的價值,當你不需要時間的日或時區。雖然時區未存儲在LocalDate筆記中,但您必須指定一個時區來確定「今天」。世界各地的日子並不是一回事,因爲東部的一個新的日子已經到來。因此請指定您想要的/預期的時區。如果省略,則隱式應用JVM的當前默認時區。該默認值可以隨時更改,即使在運行時(!),也可以更明確地指定時區。

ZoneId zoneId = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(zoneId); 

在MySQL中,利用其DATE類型存儲日期,唯一的價值。使用java.sql.Date來檢索/存儲這些值。立即轉換爲java.time類型。

LocalDate stored = myJavaSqlDate.toLocalDate(); 

通過調用isEqualisBefore,或isAfter比較。你的問題不清楚,所以我不確定你的業務邏輯需要哪個。

if(stored.isBefore(today)) { 
    java.sql.Date dateToStore = java.sql.Date.valueOf(today); 
    // … store today’s date in database. 
} 

如果有需要,你可以將這個LocalDate日期只到日期時間,得到相應的一些特定的時區,每天的第一刻。要知道,一天不總是因爲夏令時(DST),也許還有其他異常時00:00:00.0啓動。

ZonedDateTime zdt = LocalDate.atStartOfDay(zoneId); 

toString呼叫來生成日期時間值的標準ISO 8601格式的字符串表示。

String output = zdt.toString(); // Ex: 2016-12-03T00:00:00-05:00[America/Montreal]