[英]Java. How to get month, year, day from Jspinner which is associated with java.util.Date?
我有一個叫Clock的微調器,它可以保存時間。 但是問題在於我需要單獨的所有數據,因為該數據(月,日...將用於比較)。 我有這段代碼,這返回了巨大的字符串奇怪行(2017年美國東部時間5月11日星期四18:02:00),我什至無法拆分並存儲到數組中(只打印整行)也不寫入文件(只是空文件)。 有沒有辦法從這個JSpinner獲取月,日,年?
private void ClockStateChanged(javax.swing.event.ChangeEvent evt) {
Date date = (Date) Clock.getValue();
System.out.print(date);
String dateString = null;
SimpleDateFormat sdfr = new SimpleDateFormat("");
dateString = sdfr.format(date);
System.out.println( dateString );
}
使用日歷對象獲取日期,月份和年份
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int month = calendar.get(Calendar.MONTH) + 1;
int year = calendar.get(Calendar.YEAR);
Calendar.MONTH從零開始,因此月份增加1。
嘗試使用日歷:
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
int year = cal.get(Calendar.YEAR);
int day = cal.get(Calendar.DAY);
文檔中有關Calendar類的更多信息
Calendar類是一個抽象類,提供用於在特定時間點和一組日歷字段(例如YEAR,MONTH,DAY_OF_MONTH,HOUR等)之間進行轉換的方法,以及用於處理日歷字段(例如獲取日期)的方法。下周的。
myJavaUtilDate.toInstant()
.atZone( ZoneId.of( "America/Montreal" ) )
.toLocalDate()
.toString()
2017-01-23
不要將日期時間對象與代表其值的字符串混淆。 可以通過解析字符串來創建日期時間對象。 日期時間對象可以生成一個字符串來表示其值。 但是字符串和日期時間對象是不同且分開的。 因此,日期時間對象沒有“具有格式”。
您正在使用麻煩的舊日期時間類( Date
和Calendar
),這些類現在已被遺留,由java.time類取代。
如果數據源(Swing)尚未更新為直接處理java.time類型,請進行轉換。 查看添加到舊類中的新轉換方法。
Instant
類以UTC表示時間軸上的時刻,分辨率為納秒 (最多十進制的九(9)位數字)。
Instant instant = myJavaUtilDate.toInstant() ;
Instant.toString():2017-01-23T06:23:45.678Z
java.util.Date
和Instant
都使用UTC。 要確定日期,您必須分配一個時區。 在任何給定的時刻,日期在世界各地都會有所不同。 例如,法國巴黎午夜過后幾分鍾是新的一天,而在魁北克蒙特利爾仍然是“昨天”。
以continent/region
的格式指定正確的時區名稱 ,例如America/Montreal
, Africa/Casablanca
或Pacific/Auckland
。 切勿使用EST
或IST
等3-4個字母的縮寫,因為它們不是真實的時區,不是標准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ; // Or ZoneId.systemDefault()
ZonedDateTime zdt = instant.atZone( z );
zdt.toString():2017-01-23T01:23:45.678 + 05:00 [美國/蒙特利爾]
現在,您可以提取僅日期部分。 LocalDate
類表示沒有日期和時區的僅日期值。
LocalDate ld = zdt.toLocalDate();
您的問題不清楚您的目標。 如果您只想序列化此日期值以供以后比較,請以標准ISO 8601格式寫為文本。 解析/生成字符串時,java.time類默認使用ISO 8601格式。
我建議您盡可能使用標准的ISO 8601字符串格式。 它們旨在最大程度地減少歧義。 它們很容易用機器解析。 跨不同文化的人類很容易閱讀它們。
String output = ld.toString() ;
2017-01-23
如果您確實想要年,月和日的各個部分,請詢問LocalDate
對象。 與傳統類不同,在java.time中,月份在1月至12月的數字為1-12。
int year = ld.getYear() ;
int month = ld.getMonthValue() ;
int dayOfMonth = ld.getDayOfMonth() ;
您還可以將月份作為強大的Month
枚舉對象。
Month m = ld.getMonth();
java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.Date
, Calendar
和SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time類。
要了解更多信息,請參見Oracle教程 。 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310 。
在哪里獲取java.time類?
ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.