[英]Setting and formatting time zone with Calendar object in Java and then returning a Date object
[英]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));
應該為您解決。
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 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 );
順便說一句,將來在將日期,時間或日期時間序列化為字符串時(例如您在SQLite數據庫中所做的那樣),我強烈建議使用標准ISO 8601格式: YYYY-MM-DD
, HH: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 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.Date
, Calendar
和SimpleDateFormat
。
現在處於維護模式的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中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.