Java SimpleDateformatter,秒后有十进制小数,无法转换为Date

时间:2018-11-02 13:58:47

标签: java simpledateformat milliseconds datetime-parsing

我正在尝试将10毫秒(2018-11-02 6:05:59.1541162159 PM)的日期字符串转换为日期,但无法获得确切的日期。

要转换的代码:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class DateFormatCheck {
    private static TimeZone tz = TimeZone.getTimeZone("Asia/Colombo");
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS aa");

    public static void main(String[] a){
        try {
            Calendar cal = Calendar.getInstance(tz);
            sdf.setCalendar(cal);
            cal.setTime(sdf.parse("2018-11-02 6:05:59.1541162159 PM"));
            Date date = cal.getTime();
            System.out.println(date);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

输出:

Tue Nov 20 02:12:01 IST 2018

4 个答案:

答案 0 :(得分:13)

目前有多个问题。我强烈建议使用java.time进行尽可能多的工作,尽管即使那样做也并不容易。

正如您所说,您的值的“秒数”有10位数字-这意味着它降到了十分之一纳秒的精度。从我的经验开始,这是非常不寻常的-我不认为Java即使使用java.time也可以处理。

我怀疑您需要先对数据进行处理,精度降至9位数。那时,将值解析为ZonedDateTime很简单:

// Note this only has 9 digits of precision, not the original 10
String text = "2018-11-02 6:05:59.154116215 PM";
ZoneId zone = ZoneId.of("Asia/Colombo");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
    "yyyy-MM-dd h:mm:ss.SSSSSSSSS a", Locale.US)
    .withZone(zone);
ZonedDateTime parsed = ZonedDateTime.parse(text, formatter);
System.out.println(parsed);

请注意,我是如何提供SSSSSSSSS作为秒的一部分,以处理所有9位数字的。还要注意,使用h代替HH-HH意味着“一天24小时,填充为0”-这两个部分都不符合您的原始值,在下午6点使用“​​ 6”。很难将HHHa结合使用。

该代码为您提供了ZonedDateTime,您可以将其转换为Date,如下所示:

Date date = Date.from(parsed.toInstant());

我建议您不要这样做,除非您确实确实出于互操作原因需要这么做; Date API以各种方式令人讨厌。

答案 1 :(得分:0)

您首先需要使用SimpleDateFormat对象设置日期格式:

System.out.println(sdf.format(date));

编辑:解决解析问题后,请执行此操作以正确打印出来。

答案 2 :(得分:0)

        String dateText = "2018-11-02 6:05:59.1541162159 PM";
        String[] parsedText = dateText.split("\\.");
        String[] parsedText2 = parsedText[1].split(" ");
        String newText = new StringBuilder(parsedText[0]).append(" ").append(parsedText2[1]).toString();
        ZoneId zone = ZoneId.of("Asia/Colombo");
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd h:mm:ss a", Locale.US)
                                                                                                 .withZone(zone);
        ZonedDateTime parsed = ZonedDateTime.parse(newText, formatter).plusNanos(Long.parseLong(parsedText2[0]) / 10);
        System.out.println(parsed);

答案 3 :(得分:-1)

您只需要使用SimpleDateFormatter进行阅读:

System.out.println(sdf.format(date.getTime()));

如果要使用默认日期格式进行阅读:

private static String[] daysOfWeek = new String[]{"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};

private static TimeZone tz = TimeZone.getTimeZone("Asia/Colombo");
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS aa");

public static void main(String[] a){
    try {
        Calendar cal = Calendar.getInstance(tz);

        sdf.setCalendar(cal);

        cal.set(Calendar.AM_PM, Calendar.PM);

        cal.setTime(sdf.parse("2018-11-02 6:05:59.1541162159 PM"));

        System.out.println(
                daysOfWeek[cal.get(Calendar.DAY_OF_WEEK)] +
                        new SimpleDateFormat(" dd hh:mm:ss yyyy").format(cal.getTime()));
    }catch (Exception e){
        e.printStackTrace();
    }
}

祝你好运。