【问题标题】:ParseException on trying to convert date to milliseconds尝试将日期转换为毫秒时出现 ParseException
【发布时间】:2014-10-31 11:34:48
【问题描述】:

执行以下代码时,我收到ParseException

double toMilliseconds(double ds2) throws ParseException
{
    long durinsec;
    DateFormat formatter;
    Date convertedDate;
    String d2 = String.valueOf(ds2);
    System.out.println(d2+"string date");
    formatter = new SimpleDateFormat("yyyyMMddHHmmSS");
    convertedDate = formatter.parse(d2);
    System.out.println(convertedDate+"convertedDate");
    durinsec = convertedDate.getTime()/1000;
    System.out.println("Date from yyyyMMdd String in Java : " +durinsec ); 
    return durinsec;    
}

请帮助解决问题。我从 Java 文本字段中获取 yyyyMMddHHmmss 格式的输入。

【问题讨论】:

  • ds2 包含哪些数据?
  • ds2 包含 yyyyMMddHHmmss 格式的输入,例如“20141029090910”
  • 如果您从JTextField 获取输入,为什么首先要将输入转换为双精度值? JTextFieldgetText 方法中返回 String

标签: java swing datetime formatting


【解决方案1】:

我建议您使用另一种方法来节省所有繁琐的工作,而不是调试您的代码来查找问题:使用JFormattedTextFieldJSpinnerSpinnerDateModel 从用户那里获取输入。

您可以根据需要定义模式(即:yyyyMMddHHmmss),在 Date 对象中获取值并在此日期直接使用 getTime(),只需一点点努力。

例如:

JFormattedTextField textField = new JFormattedTextField(new SimpleDateFormat("yyyyMMddHHmmss"));
textField.setValue(new Date());

JSpinner spinner = new JSpinner(new SpinnerDateModel());
spinner.setEditor(new JSpinner.DateEditor(spinner, "yyyyMMddHHmmss"));

编辑

如果 20141029090910 是双精度,那么 String.valueOf(20141029090910d) 将返回如下内容:

 2.014102909091E13

这将导致解析异常,因为它与您的模式不匹配。

【讨论】:

  • 好的。但是如果我使用 JSpinner,我如何将其转换为秒并将其存储在双变量中。
  • durinsec = ((Date)spinner.getValue()).getTime() / 1000 ?请阅读我链接的教程。 @user3857726
  • 非常感谢您的帮助。
【解决方案2】:

我认为根本问题是您使用double 来表示时间戳。它肯定会引起问题,尤其是如果您使用像这样的有趣数字编码...

当你这样做时:

  String d2 = String.valueOf(ds2);

您以十进制浮点格式对数字进行编码,如here 所述。在几乎所有情况下,该转换产生的字符串都将包含一个小数点;即一个“。”。带小数点的数字字符串与您的日期格式不匹配。

第二个问题是您作为double 的编码没有数学 意义。例如,如果您将两个日期编码为 double 值(使用您的技术),然后从另一个中减去一个,则结果将是荒谬的。当然,作为一个持续时间是没有意义的。

(几乎还有第三个问题......除了double 的精度刚好可以表示您的数字。您需要 14 个十进制数字,而double 给您 15.97。)


我建议您停止像这样将日期表示为doubles。如果您确实想将它们表示为数字,请使用标准约定;即在某个“纪元”之前或之后的整数秒(或毫秒、微秒、纳秒等)。更好的是,使用“从 1970-01-01-00:00.000 开始的毫秒数”......这是 Java 库使用的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多