преобразование строки в метку времени дает дополнительный «0» - PullRequest
0 голосов
/ 04 апреля 2019

Я конвертирую Строка в Метка времени , но формат вывода имеет дополнительный '0'.

Ниже приведен код.

Код:

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class StringToTimeStamp {

    public static void main(String[] args) {

        String date = "2017-01-01T00:00:00.000-05:00";


        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");


        try {
            java.util.Date parsedDate = dateFormat.parse(date);
            System.out.println(parsedDate);
            Timestamp time = new Timestamp(parsedDate.getTime());
            System.out.println(time);

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

    }

}

Выход

Sun Jan 01 00:00:00 IST 2017
2017-01-01 00:00:00.0

Ожидаемый вывод

Sun Jan 01 00:00:00 IST 2017
2017-01-01 00:00:00

Я не являюсьспособен понять, почему в выводе присутствует дополнительный «0»?

Версия JDK: 1.8.0_191

РЕДАКТИРОВАТЬ

Я попытался отформатировать свой экземпляр отметки времени следующим образом:

System.out.println(dateFormat.format(time));

Он дал следующий вывод:

Sun Jan 01 00:00:00 IST 2017
2017-01-01T00:00:00

Он удалил «0», но добавил «T».

Ответы [ 4 ]

3 голосов
/ 04 апреля 2019

Смарт-объекты, а не тупые строки

Убедитесь, что вы понимаете, что объект даты и времени - это , а не текст, который не совпадает с String.

Объект даты и времени может генерировать строку, содержащую текст, который представляет значение.Эта строка может быть создана в соответствии с различными форматами, локализованными для всех типов локалей.И объект даты-времени может быть создан путем анализа входной строки после преобразования в значение для объекта.Но строка и объект даты и времени разделены и различны.

Используйте объекты даты и времени в вашей кодовой базе всякий раз, когда это целесообразно, вместо того, чтобы полагаться на простые строки.

java.time

Вы используете ужасные классы даты и времени, которые были вытеснены несколько лет назад классами java.time .Никогда не используйте java.util.Date, ни java.sql.Timestamp.

. Анализируйте входную строку как OffsetDateTime объект.

String input = "2017-01-01T00:00:00.000-05:00" ;
OffsetDateTime odt = OffsetDateTime.parse( input ) ;

Если ваша цель - сохранить это значение как переменную-член в вашем классе, сделайте эту переменную-член типа OffsetDateTime, а не String.

Метод toString генерирует текст в стандартном формате ISO 8601.

Для создания текста в других форматах используйте класс DateTimeFormatter.Этот класс уже освещался много раз, поэтому ищите переполнение стека, чтобы узнать больше.

Остерегайтесь генерации строк, которые представляют момент, но при этом опускают индикатор часового пояса или смещения от UTC.Это все равно, что сообщать сумму денег, не упоминая при этом валюту.

DateTimeFormatter f =  DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ) ;
String output = odt.format( f ) ;
2 голосов
/ 04 апреля 2019

Вы можете попробовать следующий код. Я добавил новый форматер и преобразовал метку времени в нужный вам формат.

Я добавил следующий подход, предполагая, что вам нужно отформатировать дату, распечатать ее и одновременно отформатировать метку времени и преобразовать ее тоже.

public static void main(String args[]) throws ParseException {
    String date = "2017-01-01T00:00:00.000-05:00";
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try {
        java.util.Date parsedDate = dateFormat.parse(date);
        System.out.println(parsedDate);
        Timestamp time = new Timestamp(parsedDate.getTime());
        System.out.println(dateFormat2.format(time.getTime()));

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

}
1 голос
/ 04 апреля 2019

Дополнительное «0» для миллисекунд. И опустить это вы можете перейти по ссылке ниже,

Преобразование даты Java в Sql timestamp

и оттуда это решение, https://stackoverflow.com/a/22857062/1529092

java.util.Date utilDate = new java.util.Date();
java.sql.Timestamp sq = new java.sql.Timestamp(utilDate.getTime());
System.out.println(sa); //this will print the milliseconds as the toString() has been written in that format

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(timestamp)); //this will print without ms

Или вы можете использовать ссылку ниже, чтобы конвертировать в разные форматы, Как удалить миллисекунды из формата объекта даты в Java

1 голос
/ 04 апреля 2019

Вы печатаете временную метку. пожалуйста, измените его на строку, как показано ниже

  String timeStamp = new SimpleDateFormat("yyyy.MM.dd HH.mm.ss").format(time);

даст ожидаемый результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...