Java。如何从Jspinner中获取与java.util.Date关联的月、年、日?

Java. How to get month, year, day from Jspinner which is associated with java.util.Date?

我有一个名为 Clock 的微调器,它可以保存时间。但问题是我需要单独的所有数据,因为该数据(月、日......将用于比较)。我有这个代码,这个 return 巨大的奇怪字符串行 (Thu May 11 18:02:00 EEST 2017) 我什至不能拆分并存储到数组中(只打印整行)也不能写入文件(只是空的)文件)。有什么方法可以从这个 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 cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
int year = cal.get(Calendar.YEAR);
int day = cal.get(Calendar.DAY);

documentation

中有关日历 class 的更多信息

The Calendar class is an abstract class that provides methods for converting between a specific instant in time and a set of calendar fields such as YEAR, MONTH, DAY_OF_MONTH, HOUR, and so on, and for manipulating the calendar fields, such as getting the date of the next week.

使用日历对象获取日、月、年

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。

tl;博士

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

2017-01-23

日期时间不是字符串

不要将日期时间对象与表示其值的字符串混淆。可以通过解析字符串来创建日期时间对象。日期时间对象可以生成一个字符串来表示它的值。但是字符串和日期时间对象是不同且独立的。所以日期时间对象没有“格式”。

使用java.time

您正在使用麻烦的旧日期时间 classes(DateCalendar),它们现在已成为遗留问题,被 java.time classes.

如果数据源 (Swing) 尚未更新为直接处理 java.time 类型,请转换。查看添加到旧 classes 的新转换方法。

Instant class represents a moment on the timeline in UTC with a resolution of nanoseconds(最多九 (9) 位小数)。

Instant instant = myJavaUtilDate.toInstant() ;

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

java.util.DateInstant 都是 UTC。要确定日期,您必须分配时区。对于任何给定时刻,世界各地的日期因地区而异。例如,在法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天”。

指定 proper time zone name in the format of continent/region, such as America/Montreal, Africa/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[America/Montreal]

现在您可以提取仅限日期的部分。 LocalDate class 表示没有时间和时区的仅日期值。

LocalDate ld = zdt.toLocalDate();

您的问题不清楚您的目标。如果您只想序列化此日期值以供以后比较,请以标准 ISO 8601 格式编写为文本。当 parsing/generating 字符串时,java.time classes 默认使用 ISO 8601 格式。

我建议您尽可能坚持字符串的标准 ISO 8601 格式。它们旨在最大程度地减少歧义。它们很容易被机器解析。它们很容易被不同文化的人阅读。

String output = ld.toString() ;

2017-01-23

如果您确实需要年、月和日的各个部分,请查询 LocalDate 对象。与旧版 classes 不同,在 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 framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

从哪里获得java.time classes?

  • Java SE 8 and SE 9 及更高版本
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and SE 7
  • Android
    • ThreeTenABP 项目专门为 Android 改编 ThreeTen-Backport(如上所述)。
    • 参见

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.