簡體   English   中英

如何在Java中移動日歷?

[英]How to Shift Calendar in Java?

我試圖編寫一種Java方法來移動日歷,使用以毫秒為單位的時間偏移量。 但是,當我嘗試移動一個月(30天)時,它不起作用:

Calendar c = new GregorianCalendar(2012, 5, 23, 13, 23, 10);
long original = c.getTimeInMillis();
System.out.println("Original Date "+c.getTime());

long oneMonth = 30*24*60*60*1000;   //one month in milliseconds
Calendar c_1Month = new GregorianCalendar();
c_1Month.setTimeInMillis(original+oneMonth);
System.out.println("After 1-month "+c_1Month.getTime());

輸出是

Original Date Sat Jun 23 13:23:10 PDT 2012
After 1-month Sun Jun 03 20:20:22 PDT 2012

您會看到它沒有將其正確地轉移到7月23日。 我了解日歷中有一種特定的方法add(field,amount),我可以使用該方法更改月份,但我想在客戶端中使用一種方法來更改時間,並提供以毫秒為單位的偏移量(偏移量基於在我的測試中,我不想為此使用多種方法)。

您認為變量oneMonth是一個long,但是您為其分配了一個整數值。 但是30*24*60*60*1000不適合整數,因此會溢出為負值。

如果將代碼更改為long oneMonth = 30*24*60*60*1000L; 它會工作。

但是,盡管代碼中存在“錯誤”,但azurefrog的注釋是正確的,這不是建議增加一個月的方法,只有在您希望增加30天的情況下才有效,這是不同的。

嘗試改用如下形式:

c_1Month.add( Calendar.DAY_OF_MONTH, 30);

要么

c_1Month.add( Calendar.MONTH, 1);

Calendar類知道並能夠很好地處理所有極端情況。 我建議你依靠這個。 它減少了可能的錯誤,並使代碼更易於閱讀和理解。

在Java 8中,要使用的代碼為:

LocalDateTime.now().plusMonths(1);

要么

LocalDateTime.now().plusDays(30);

30*24*60*60*1000的末尾添加“ L”

計算方式將整個過程轉換為一個整數。

不要相信我:),嘗試在1000后面加上L之前打印值;

    System.out.println(oneMonth);

您的最終代碼應為:

    Calendar c = new GregorianCalendar(2012, 5, 23, 13, 23, 10);
    long original = c.getTimeInMillis();
    System.out.println("Original Date "+c.getTime());

    long oneMonth = 30*24*60*60*1000L;   //one month in milliseconds

    Calendar c_1Month = new GregorianCalendar();
    c_1Month.setTimeInMillis(original+oneMonth);
    System.out.println("After 1-month "+c_1Month.getTime());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM