Java 分析日期和时间之间带有“T”的时间戳

Java 分析日期和时间之间带有“T”的时间戳,java,postgresql,Java,Postgresql,我试图解析从数据库收到的时间戳,我尝试了多个解析字符串,但每个都不起作用。我正试图提取日期和时钟 import java.util.Locale; import java.util.Date; import java.text.ParseException; import java.text.SimpleDateFormat; public class Main{ public static void main(String []args){ try {

我试图解析从数据库收到的时间戳,我尝试了多个解析字符串,但每个都不起作用。我正试图提取日期和时钟

import java.util.Locale;
import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Main{
    public static void main(String []args){
        try {
            // error here!
            SimpleDateFormat postgre = new SimpleDateFormat("yyyy-MM-ddXHH:mm:ss.ms", Locale.getDefault());
            Date d = postgre.parse("2019-08-07T09:51:17.222Z");

            System.out.println(new SimpleDateFormat("HH:mm", Locale.getDefault()).format(d));
            System.out.println(new SimpleDateFormat("dd MMMMM yyyy", Locale.getDefault()).format(d));
        } catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}
是的,我需要使用遗留类。

正确的模式是yyyy-MM-dd'T'HH:MM:ss.SSS'Z'。我忘记用大写字母S表示毫秒。

正确的模式是yyyy-MM-dd'T'HH:MM:ss.SSS'Z'。我忘记用大写字母S表示毫秒。

tl;博士 使用现代java.time类的简单单行程序,多年前这些类取代了Date和SimpleDataFormat等糟糕的遗留类

有关一天中的时间部分,请致电toLocalTime

要通过墙上的时钟查看特定地区或时区的人使用的同一时刻,请应用ZoneId以获取ZonedDateTime对象。然后调用toLocalDate和LocalTime

细节 使用现代类Java.time.Instant进行解析

您的输入字符串采用标准ISO 8601格式。默认情况下,java.time类在解析/生成字符串时使用这些标准格式。因此,无需指定格式化模式

Instant instant = Instant.parse( "2019-08-07T09:51:17.222Z" ) ;
生成ISO 8601字符串

String output = instant.toString() ; 
要写入数据库,请转换为同级类OffsetDateTime。虽然对Instant的支持在JDBC4.2及更高版本中是可选的,但您的JDBC驱动程序需要支持OffsetDateTime

检索

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Instant instant = odt.toInstant() ;
如果希望查看UTC中的日期和时间,而不是某个时区,请提取LocalDate和LocalTime

最好避免可怕的遗留类java.util.Date。但如果必须,可以使用添加到旧类的新to/from方法来回转换

java.util.Date d = Date.from( instant ) ;
同样,当收到日期时,立即转换为瞬间。然后继续您的业务逻辑

Instant instant = myDate.toInstant() ;
tl;博士 使用现代java.time类的简单单行程序,多年前这些类取代了Date和SimpleDataFormat等糟糕的遗留类

有关一天中的时间部分,请致电toLocalTime

要通过墙上的时钟查看特定地区或时区的人使用的同一时刻,请应用ZoneId以获取ZonedDateTime对象。然后调用toLocalDate和LocalTime

细节 使用现代类Java.time.Instant进行解析

您的输入字符串采用标准ISO 8601格式。默认情况下,java.time类在解析/生成字符串时使用这些标准格式。因此,无需指定格式化模式

Instant instant = Instant.parse( "2019-08-07T09:51:17.222Z" ) ;
生成ISO 8601字符串

String output = instant.toString() ; 
要写入数据库,请转换为同级类OffsetDateTime。虽然对Instant的支持在JDBC4.2及更高版本中是可选的,但您的JDBC驱动程序需要支持OffsetDateTime

检索

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Instant instant = odt.toInstant() ;
如果希望查看UTC中的日期和时间,而不是某个时区,请提取LocalDate和LocalTime

最好避免可怕的遗留类java.util.Date。但如果必须,可以使用添加到旧类的新to/from方法来回转换

java.util.Date d = Date.from( instant ) ;
同样,当收到日期时,立即转换为瞬间。然后继续您的业务逻辑

Instant instant = myDate.toInstant() ;

那么,当前代码的问题是什么?因为如果T和Z困扰你,你只需要使用string.Replace将其转换为spaces为什么当我们发布一个问题时,我们突然发现它是对的?我现在将删除我的问题是可以的,这是可能发生的。对不起,我知道这听起来有点无知,但是是什么让你认为你需要使用遗留的日期和时间类呢?你有一个邪恶的老板这么说吗?SimpleDateFormat尤其是出了名的麻烦,现代java日期和时间API java.time已经被后传到java 6和7,并在API级别26下进一步适应Android。如果它在数据库中,那么从数据库中检索它作为时间戳或即时信息是否有意义,而不是字符串?那么当前代码有什么问题?因为如果T和Z困扰你,你只需要使用string.Replace将其转换为spaces为什么当我们发布一个问题时,我们突然发现它是对的?我现在将删除我的问题是可以的,这是可能发生的。对不起,我知道这听起来有点无知,但是是什么让你认为你需要使用遗留的日期和时间类呢?你有一个邪恶的老板这么说吗?特别是SimpleDataFormat是出了名的麻烦,现代java日期和时间API java.time已经被后传到java 6和7,并在API级别26下进一步适应Android。如果它在数据库中,那么将它作为时间戳或即时而不是字符串从数据库中检索是否有意义?它更接近,但仍然不完全正确。Z是UTC的零偏移量,因此需要进行解析,而不是以文字形式进行解析,否则在绝大多数JVM上都会出现错误的时间。Z是UTC的零偏移量,因此需要进行解析,而不是将其作为文字进行解析,否则您将在绝大多数J上得到错误的时间 虚拟机。