簡體   English   中英

Java Calendar對象,分別設置日期和時間

[英]Java Calendar object, setting date and time separately

創建日歷對象並使用SimpleDateFormat設置日期/時間以解析字符串時,是否可以在兩行代碼中設置日期和時間? 例如,在我的SQLite數據庫中,日期(mm-dd-yyyy)與時間(hh:mm)存儲在單獨的列中。 做下面的事情是猶太潔食:

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdfDate = new SimpleDateFormat("MM-dd-yyyy");
SimpleDateFormat sdfTime = new SimpleDateFormat("hh:mm zzz");
cal.setTime(sdfDate.parse(DATE));
cal.setTime(sdfTime.parse(TIME));

第二個cal.setTime行是否會將日歷對象的日期部分重置為現在並僅更改時間?

是的,會的。

setTime()設置時間,而與日期不包含任何時間值(00:00:00)或不包含日期值(01.01.1970)的事實無關。

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdfDate = new SimpleDateFormat("MM-dd-yyyy hh:mm zzz");
cal.setTime(sdfDate.parse(DATE+ " " + TIME));

應該為您解決。

TL;博士

ZonedDateTime.of( 
    LocalDate.parse( "12-23-2015" , DateTimeFormatter.ofPattern( "MM-dd-yyyy") ) ,
    LocalTime.parse( "21:43" ) , 
    ZoneId.of( "Pacific/Auckland" )
)
.toString()

2015-12-23T21:43 + 13:00 [太平洋/奧克蘭]

細節

Jan的答案是正確的。

java.time

另外,您可以使用新的日期時間框架java.time。

Java 8和更高版本中內置的java.time框架取代了麻煩的舊java.util.Date/.Calendar類。 新課程的靈感取自於成功的Joda-Time框架,該框架旨在作為其繼任者,其概念相似但經過重新架構。 JSR 310定義。 ThreeTen-Extra項目擴展。 請參閱教程

如果您的輸入缺少與UTC偏移量 ,那么我們可以分別處理日期和時間。 新類包括LocalDate ,表示沒有日期的僅日期值, LocalTime表示沒有日期的僅時間值。 然后,您可以將它們組合並調整到其預期的時區。

DateTimeFormatter formatterDate = DateTimeFormatter.ofPattern( "MM-dd-yyyy");
LocalDate localDate = LocalDate.parse( "12-23-2015" , formatterDate );
LocalTime localTime = LocalTime.parse( "21:43" );
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.of( localDate , localTime , zoneId );

但是您的時間字符串中確實包含一個與UTC的偏移量。 因此,我們應該采用與Jan的Answer相同的方法,連接成對的字符串,然后進行解析。

String input = "12-23-2015" + " " + "21:43-05:00" ;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MM-dd-yyyy HH:mmxxx");
ZonedDateTime zdt = ZonedDateTime.parse( input , formatter );

ISO 8601

順便說一句,將來在將日期,時間或日期時間序列化為字符串時(例如您在SQLite數據庫中所做的那樣),我強烈建議使用標准ISO 8601格式: YYYY-MM-DDHH:MM ,以及YYYY-MM-DDTHH:MM:SS.S±00:00 例如, 2007-12-03T10:15:30+01:00 這些格式是標准化的,易於人類閱讀和識別,並且易於計算機解析而沒有歧義。

默認情況下,java.time框架解析並生成這些格式的字符串。 另外,java.time通過在方括號中附加時區名稱來擴展ISO 8601。 例如, 2007-12-03T10:15:30+01:00[Europe/Paris]


關於java.time

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

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

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

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

在哪里獲取java.time類?

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

暫無
暫無

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

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