Java-将JLabel解析为java.util.Date

时间:2018-09-30 16:34:00

标签: java date datetime simpledateformat

我只是尝试使用simpleDateFormatter()将JLabel中的字符串解析为一个日期。根据我在网上搜索的所有内容,此代码应该可以正常工作。但是,我在编译过程中收到“找不到符号-方法解析(java.lang.String)”错误。任何有关如何解决该问题的建议将不胜感激。

使用基于JDBC的数据库查询中的日期填充有问题的JLabel。

此外,我知道java.util.Date已被弃用,但仍想将其用于此目的。

代码段:

private Format formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
private JLabel dateDataLabel = new JLabel("");

private void setAndParseLabel()
{
    dateDataLabel.setText(formatter.format(validatePass.eventDate));

    java.util.Date aDate = formatter.parse(dateDataLabel.getText());
}

3 个答案:

答案 0 :(得分:2)

tl; dr

  • 您正在忽略时区的关键问题。您正在不经意地将输入解析为UTC中的值。
  • 您使用的是可怕的旧日期时间类,而这些类早已被取代。改用 java.time

示例代码:

LocalDateTime
.parse( 
    "2018-01-23 13:45".replace( " " , "T" )  // Comply with standard ISO 8601 format by replacing SPACE with `T`. Standard formats are used by default in java.time when parsing/generating strings.
)                                            // Returns a `LocalDateTime` object. This is *not* a moment, is *not* a point on the timeline.
.atZone(                                     // Apply a time zone to determine a moment, an actual point on the timeline.
    ZoneId.of( "America/Montreal" ) 
)                                            // Returns a `ZonedDateTime` object.
.toInstant()                                 // Adjust from a time zone to UTC, if need be.

java.time

现代方法使用 java.time 类。

您的输入字符串几乎是标准的ISO 8601格式。为了完全符合要求,请在中间用T替换该SPACE。

String input = "2018-01-23 13:45".replace( " " , "T" ) ;

解析为LocalDateTime,因为您的输入没有时区或UTC偏移量的指示。

LocalDateTime ldt = LocalDateTime.parse( input ) ;

根据定义,LocalDateTime不能表示时刻,不是时间线上的一点。它表示大约26-27小时(全球时区范围)内的潜在时刻。

要确定时刻,请分配一个时区(ZoneId)以获取一个ZonedDateTime对象。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用3-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;

如果您希望在UTC的挂钟时间看到相同的时刻,请提取Instant

Instant instant = zdt.toInstant() ;  // Adjust from some time zone to UTC.

在可行的情况下避免使用java.util.Date。但是,如果您必须与尚未更新为 java.time 的旧代码进行互操作,则可以前后转换。调用添加到旧类中的新转换方法。

java.util.Date d = java.util.Date.from( instant ) ;  // Going the other direction: `myJavaUtilDate.toInstant()`

关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:1)

java.text.Format没有方法parse,因此代码无法编译。

您可以通过java.text.DateFormat进行引用:

private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");

答案 2 :(得分:1)

parse中没有方法java.text.Format。请改用java.text.DateFormat

private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");