簡體   English   中英

在Java中使用simpledateformat增加n天

[英]Add n number of days using simpledateformat in java

我們在這里有一個Java代碼段

import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatExample {
public static void main(String[] args) {
    Date date = new Date();
    int days = 5;
    SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    String strDate= formatter.format(date.getTime() + (days*86400000));
    System.out.println(strDate);
}
}

加n號 到今天為止的天數。 結果將是正確的,直到n=24但在n=24之后給出上個月。 為什么會這樣呢?

問題是int is overflowing

考慮

    int days = 25;
    int d = days*86400000;
    System.out.println(d);

嘗試

    int days = 25;
    long d = days*86400000L;
    System.out.println(d);

tl; dr

LocalDate               // Represent a date-only, without a time-of-day and without a time zone.
.now()                  // Capture the current date, as seen through your JVM’s current default time zone. Better to pass a `ZoneId` as the optional argument.
.plusDays( 5 )          // Add five days, returning a new `LocalDate` object. Per the Immutable Objects pattern, a new object is produced rather than changing (“mutating”) the original.
.format(                // Generate text representing the date value of our `LocalDate` object.
    DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) // Define a formatting pattern to suit your taste. Or call the `.ofLocalized…` methods to localize automatically. 
)                       // Returns a `String`.

java.time

Date類表示UTC中的時刻,具有時間的日期以及與UTC的偏移量為零。 使用僅日期值時使用了錯誤的類。

避免使用可怕的舊舊式日期時間類,例如CalendarDateSimpleDateFormat 這些類在幾年前被java.time類所取代。

不要以秒或毫秒為單位來跟蹤天。 日子並非總是24小時長,幾年也不總是365天長。

LocalDate

而是使用LocalDate類。

LocalDate today = LocalDate.now() ;
LocalDate later = today.plusDays( 5 ) ;

兌換

最好完全避免使用遺留類 但是,如果必須與尚未更新為java.time類的舊代碼進行互操作,則可以來回轉換。 調用添加到舊類中的新方法。

對於Date您需要添加一個時間。 我希望您會喜歡一天的第一刻。 我假設您要將日期設置為UTC而不是時區。 我們必須通過一個OffsetDateTime對象來添加時間和偏移量。 對於偏移量,我們使用常量ZoneOffset.UTC 然后,我們提取更基本的Instant類對象以轉換為java.util.Date

OffsetDateTime odt = OffsetDateTime.of( later , LocalTime.MIN , ZoneOffset.UTC ) ;  // Combine the date with time-of-day and with an offset-from-UTC.
Instant instant = odt.toInstant() ;  // Convert to the more basic `Instant` class, a moment in UTC, always UTC by definition.
java.util.Date d = java.util.Date.from( instant ) ;  // Convert from modern class to legacy class.

往另一個方向:

Instant instant = d.toInstant() ;  // Convert from legacy class to modern class. 

關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310

您可以直接與數據庫交換java.time對象。 使用與JDBC 4.2或更高版本兼容的JDBC驅動程序 不需要字符串,不需要java.sql.*類。

在哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

使用days*86400000L進行long計算,否則int值將溢出。

在您的代碼中嘗試以下代碼:

Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.DATE, 5); 

strDate = formatter.format(cal.getTime());

暫無
暫無

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

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