StringDate to Date поступает в разное время в SimpleDateFormat в java - PullRequest
0 голосов
/ 26 февраля 2020
    /*I want the same Date of my String has
     Tried with couple of options but nothing worked 
     pasting some of code here */

    public void stringToDate() {

        //Current format "13-FEB-20 03.21.08.100000000 PM" in Melbourne Timezone
        //Required Format yyyy-dd-MM HH:mm:ss.SSS in Melbourne Timezone

        String inputAM = "13-FEB-20 03.21.08.100000000 PM";
        try {
            DateFormat df1 = new SimpleDateFormat("dd-MMM-yy hh.mm.ss.S aa");
            Date d1 = df1.parse(inputAM);
            System.out.println("Date-1: " + d1); //Fri Feb 14 19:07:48 AEDT 2020

            DateFormat df2 = new SimpleDateFormat("DD-MMM-yy hh.mm.ss.S aa");
            Date d2 = df2.parse(inputAM);
            System.out.println("Date-2: " + d2); //Tue Jan 14 19:07:48 AEDT 2020

        } catch (ParseException e) {
            e.printStackTrace();
        }

        SimpleDateFormat etDf = new SimpleDateFormat("yyyy-dd-MM HH:mm:ss.SSS");
        TimeZone etTimeZone = TimeZone.getTimeZone("Australia/Melbourne");
        etDf.setTimeZone(etTimeZone);

        DateFormat df3 = new SimpleDateFormat("dd-MMM-yy HH.mm.ss.SSSSSSSSS a");
        Date d3;
        try {
            d3 = df3.parse(inputAM);
            System.out.println("Date-3: " + d3); //Fri Feb 14 07:07:48 AEDT 2020
            System.out.println("Date-4: " + etDf.format(d3.getTime())); //2020-14-02 07:07:48.000
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

1 Ответ

3 голосов
/ 26 февраля 2020

Во-первых, для большинства целей не конвертируйте дату и время из одного строкового формата в другой. В вашей программе сохраняйте дату и время как правильные объекты даты и времени, а не строки. Когда вы принимаете строковый ввод, проанализируйте его первым делом. Только когда вам нужно выдать строку, отформатируйте дату и время в строку в требуемом формате.

Во-вторых, используйте java .time, современный Java API даты и времени для всех ваших дата и время работы. Работать с ней намного приятнее, чем со старыми, плохо спроектированными и давно устаревшими классами, включая DateFormat, SimpleDateFormat и Date.

. Анализировать ввод, используя java .time

*. 1009 *

Выходные данные:

2020-02-13T15: 21: 08.100 + 11: 00 [Австралия / Мельбурн]

Форматирование с использованием java .time

    //Required Format yyyy-dd-MM HH:mm:ss.SSS in Melbourne Timezone
    DateTimeFormatter requiredFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS");
    String formatted = dateTime.format(requiredFormatter);
    System.out.println(formatted);

2020-02-13 15: 21: 08.100

Что пошло не так в вашем коде?

Когда я впервые пробовал ваш код, синтаксический анализ произошел для FEB, потому что ваш код не указывает локаль, а мой Java использует не-Engli sh локаль по умолчанию.

Исправление, что я смог разобрать строку и получил те же результаты, что и вы (только в моем часовом поясе). Что происходит: SimpleDateFormat принимает верхний регистр S для обозначения миллисекунд , 1000 тысячных секунд, независимо от того, сколько S есть и сколько цифр в строке для анализа. Таким образом, 100 000 000 миллисекунд были добавлены к вашей дате и времени. Это чуть больше одного дня. Таким образом, вы получили 14 февраля вместо 13 февраля, а также неправильное время суток. В отличие от современного DateTimeFormatter верхний регистр S означает доли секунды , поэтому он обрабатывает SSSSSSSSS и SSS так, как мы ожидаем.

Прописные буквы DD для дня года, поэтому, используя это для анализа, вы получили 13-й день года (такой же, как 13 января) плюс ваши 100 000 секунд.

Прописные буквы HH для часа дня с 00 по 23. Анализ с использованием HH дал вам 03:21 дня (так же, как 03:21 AM) плюс ваши 100 000 секунд, независимо от того, что в вашей строке было указано PM.

Ссылка

...