簡體   English   中英

Java。 如何從與java.util.Date關聯的Jspinner獲取月,年,日?

[英]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等)之間進行轉換的方法,以及用於處理日歷字段(例如獲取日期)的方法。下周的。

tl; dr

myJavaUtilDate.toInstant()
              .atZone( ZoneId.of( "America/Montreal" ) )
              .toLocalDate()
              .toString()

2017-01-23

日期時間不是字符串

不要將日期時間對象與代表其值的字符串混淆。 可以通過解析字符串來創建日期時間對象。 日期時間對象可以生成一個字符串來表示其值。 但是字符串和日期時間對象是不同且分開的。 因此,日期時間對象沒有“具有格式”。

使用java.time

您正在使用麻煩的舊日期時間類( DateCalendar ),這些類現在已被遺留,由java.time類取代。

如果數據源(Swing)尚未更新為直接處理java.time類型,請進行轉換。 查看添加到舊類中的新轉換方法。

Instant類以UTC表示時間軸上的時刻,分辨率為納秒 (最多十進制的九(9)位數字)。

Instant instant = myJavaUtilDate.toInstant() ;

Instant.toString():2017-01-23T06:23:45.678Z

java.util.DateInstant都使用UTC。 要確定日期,您必須分配一個時區。 在任何給定的時刻,日期在世界各地都會有所不同。 例如,法國巴黎午夜過后幾分鍾是新的一天,而在魁北克蒙特利爾仍然是“昨天”。

continent/region的格式指定正確的時區名稱 ,例如America/MontrealAfrica/CasablancaPacific/Auckland 切勿使用ESTIST等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.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.DateCalendarSimpleDateFormat

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

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

在哪里獲取java.time類?

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

暫無
暫無

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

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