首页 > 解决方案 > 将字符串转换为时间戳会提供额外的“0”

问题描述

我正在将字符串转换为时间戳,但输出格式有额外的“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”。

标签: javatimestamp

解决方案


智能对象,而不是愚蠢的字符串

请确保您了解日期时间对象不是文本,与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 ) ;

如果您的目标是将此值作为成员变量存储在您的类中,请将该成员变量设置为 typeOffsetDateTime而不是String.

toString方法生成标准 ISO 8601 格式的文本。

要生成其他格式的文本,请使用DateTimeFormatter该类。这门课已经讲过很多次了,所以搜索 Stack Overflow 来了解更多。

小心生成代表时刻的字符串,但忽略时区指示符或与 UTC 的偏移量。这就像报告金额而忽略提及货币一样。

DateTimeFormatter f =  DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" ) ;
String output = odt.format( f ) ;

推荐阅读