首页 > 解决方案 > 如何将 JTextField 中的输入转换为日期?

问题描述

我试图结合两个程序来创建一个时钟和一个倒计时的计时器,直到用户给出一个JTextField(Swing)的时间。当我单独运行这些程序时,它似乎可以工作,但是当我将它们组合起来时,我遇到了一些JTextFieldDate.

我尝试将其JTextField转换为String第一个,然后将其解析为日期,但是当我这样做时,我得到unparsable date (yyyy-MM-dd hh-mm-ss a). 我知道代码还有很多工作要做,而且非常混乱,但我将不胜感激。这是我的代码中包含问题的部分:

JLabel time = new JLabel("Time: ", JLabel.RIGHT);
final JTextField gameDate = new JTextField("yyyy-MM-dd hh:mm:ss", 21);
DateFormat apiFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
apiFormat.setTimeZone(TimeZone.getTimeZone("EST"));
String D = gameDate.getText();
Date dateOfGame = apiFormat.parse(D);
long diff = new Date().getTime() - dateOfGame.getTime();

标签: javaswingdateparsing

解决方案


您正在创建一个包含 的文本字段yyyy-MM-dd hh:mm:ss,然后立即从中取出内容并尝试将其解析为日期时间。相反,您需要让用户在尝试解析之前在字段中输入日期和时间。

您通常会让用户按下 OK 按钮等,当他/她这样做时,然后继续呼叫getText()以获取输入的日期和时间。

也就是说,你不应该使用Date,TimeZoneSimpleDateFormat。那些旧的类有设计问题,尤其是最后一个是出了名的麻烦,而且都已经过时了。而是使用LocalDateTime, ZoneIdand DateTimeFormatterfrom java.time, 现代 Java 日期和时间 API。

也不要依赖三个字母的时区缩写,如EST. 虽然TimeZone.getTimeZone("EST")可能是确定性的,但我不知道它是给你America/New_York还是 UTC-05:00,其他读者也不知道。更令人困惑的是,EST 也可能意味着澳大利亚东部标准时间,并且可能还有其他解释。因此America/New_York,如果那是您的意图,请使用。

链接: Oracle 教程:日期时间解释如何使用java.time.


推荐阅读