尝试将日期转换为毫秒时出现ParseException

时间:2014-10-31 11:34:49

标签: java swing datetime formatting

执行以下代码时,我得到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;    
}

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

2 个答案:

答案 0 :(得分:2)

而不是调试代码来发现问题我建议你采用另一种方法来节省所有肮脏的工作:使用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

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

答案 1 :(得分:2)

我认为根本问题是您使用double来表示时间戳。它必然会引起问题,特别是如果你使用这样有趣的数字编码...

执行此操作时:

  String d2 = String.valueOf(ds2);

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

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

(几乎有第三个问题......除了double具有足够的精确度来表示你的数字。你需要14个十进制数字,double给你15.97。)


我建议您停止将日期表示为doubles。如果您确实希望将它们表示为数字,请使用标准约定;即在某些" epoch"之前或之后的整数秒(或毫秒,微秒,纳秒等)。更好的是,使用"毫秒来自1970-01-01-00:00.000" ...这是Java库使用的。

相关问题