Java SimpleDateformatter с 10 десятичными числами после секунд не может преобразовать в дату - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь преобразовать строку даты с 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 голосов
/ 05 ноября 2018
        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);
0 голосов
/ 02 ноября 2018

Есть несколько проблем в данный момент. Я бы настоятельно рекомендовал бы использовать 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» для 18:00. , Очень редко вы захотите объединить H или HH с a.

Этот код дает вам ZonedDateTime, который вы можете преобразовать в Date, например:

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

Я бы порекомендовал вам не делать это, если только вам действительно не нужно по причинам взаимодействия; Date API - это неприятно по-разному.

0 голосов
/ 02 ноября 2018

Вам просто нужно прочитать это с 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();
    }
}

Удачи.

0 голосов
/ 02 ноября 2018

Вам необходимо сначала отформатировать дату с помощью вашего объекта SimpleDateFormat:

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

Редактировать: Сделайте это, как только проблема синтаксического анализа будет решена, чтобы распечатать ее правильно.

...