Не удалось кратко преобразовать строку с миллисекундами в тип даты в Java.

Пожалуйста, найдите следующие коды:

@RunWith(JUnit4.class)
public class TestTimestamp {

    private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss.SSSSSS");
    private final static SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd HH:mm:ss");

    @Test
    public void test() throws ParseException {
        getTimestamp("20140512 16:13:09.493166 +0800", sdf);
        getTimestamp("20140515 15:04:42.690873 +0800", sdf);
        getTimestamp("20140515 15:04:45.159977 +0800", sdf);

        getTimestamp("20140512 16:13:09.493166 +0800", df);
        getTimestamp("20140515 15:04:42.690873 +0800", df);
        getTimestamp("20140515 15:04:45.159977 +0800", df);
    }

    private void getTimestamp(String time, SimpleDateFormat sdf) throws ParseException {
        System.out.println("Time to convert: " + time);
        String[] tmp = time.split("\\+");
        String str = tmp[0].trim();
        System.out.println(str);
        System.out.println(sdf.parse(str));
        System.out.println();
    }

}

Вывод с sdf очень странный, а вывод с df правильный:

//Wrong result with sdf
Time to convert: 20140512 16:13:09.493166 +0800
20140512 16:13:09.493166
Mon May 12 16:21:22 CST 2014

Time to convert: 20140515 15:04:42.690873 +0800
20140515 15:04:42.690873
Thu May 15 15:16:12 CST 2014

Time to convert: 20140515 15:04:45.159977 +0800
20140515 15:04:45.159977
Thu May 15 15:07:24 CST 2014


//Correct result with df
Time to convert: 20140512 16:13:09.493166 +0800
20140512 16:13:09.493166
Mon May 12 16:13:09 CST 2014

Time to convert: 20140515 15:04:42.690873 +0800
20140515 15:04:42.690873
Thu May 15 15:04:42 CST 2014

Time to convert: 20140515 15:04:45.159977 +0800
20140515 15:04:45.159977
Thu May 15 15:04:45 CST 2014

Не могли бы вы мне помочь?


person macemers    schedule 16.05.2014    source источник
comment
Какой у Вас вопрос?   -  person Code-Apprentice    schedule 16.05.2014
comment
Если вам не нужна точность в миллисекундах, вы можете обновить свой раскол, чтобы ограничить 3 цифры после запятой? String[] tmp = time.split("\\d{3}\\s\\+");   -  person Jeff Ward    schedule 16.05.2014
comment
возможный дубликат Convert Joda-Time DateTime - Дата формата ISO 8601 в другой формат даты   -  person dharam    schedule 16.05.2014


Ответы (2)


миллисекунда будет SSS тысячной. Длина 159977 превысит эту микросекунду.

пытаться

yyyyMMdd HH:mm:ss.SSS

person Scary Wombat    schedule 16.05.2014
comment
Да, я думаю, что он правильно преобразовал ваши 6-значные числа в миллисекунды, которые перешли в секунды, минуты и т. д. Я не вижу номер формата для наносекунд в версии javadoc SimpleDateFormat, которую я смотрю в... - person arcy; 16.05.2014
comment
Это правильно. SimpleDateFormat работает только с Date, который имеет только миллисекунды, без микросекунд или наносекунд. Возможно, вам придется написать собственную реализацию DateFormat, если вы хотите отображать или анализировать микросекунды. - person Dawood ibn Kareem; 16.05.2014
comment
Исправление: 6 цифр — это микросекунды. В наносекунде 9 цифр, в миллисекунде 3. - person Basil Bourque; 16.05.2014
comment
@BasilBourque ура, исправление внесено, я всегда путаюсь, есть ли у меня миллион или миллиард в моем банке. - person Scary Wombat; 16.05.2014

И java.util.Date, и Joda-Time имеют точность в миллисекундах. Таким образом, они могут обрабатывать только три цифры дроби. Либо усеките последние три цифры дроби, либо используйте новый пакет java.time в Java 8, который может обрабатывать наносекундную точность (9 цифр).

person Basil Bourque    schedule 16.05.2014