格式为“yyyy-mm-dd HH:mm:ss”的 Java 字符串到日期对象

Posted

技术标签:

【中文标题】格式为“yyyy-mm-dd HH:mm:ss”的 Java 字符串到日期对象【英文标题】:Java String to Date object of the format "yyyy-mm-dd HH:mm:ss" 【发布时间】:2012-12-04 20:42:10 【问题描述】:

我需要将包含日期的字符串转换为日期对象。字符串的格式为“yyyy-mm-dd HH:mm:ss.SSSSSS”,我希望在日期对象中使用相同的格式。

例如,我有一个字符串“2012-07-10 14:58:00.000000”,我需要生成的日期对象具有相同的格式。

我尝试了以下方法,但结果与预期不符。

java.util.Date temp = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss.SSSSSS").parse("2012-07-10 14:58:00.000000");

DateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
                Date thisDate = dateFormat.parse("2012-07-10 14:58:00.000000");

结果是“2012 年 1 月 10 日星期二 14:58:00 EST 2012”。请让我知道我哪里出错了。

谢谢, Yeshwanth Kota

【问题讨论】:

仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 和 Java 中内置的 java.time 类所取代9. 见Tutorial by Oracle。 @Yeshwanth,原因是您没有应用日期格式化程序 【参考方案1】:
java.util.Date temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").parse("2012-07-10 14:58:00.000000");

mm 是您想要的分钟数 MM

代码

public class Test 

    public static void main(String[] args) throws ParseException 
        java.util.Date temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS")
                .parse("2012-07-10 14:58:00.000000");
        System.out.println(temp);
    

打印:

2012 年 7 月 10 日星期二 14:58:00 EDT

【讨论】:

当我使用 java.util.Date temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS" 解析日期“2021-03-02 17:30:41.624862”时).parse("2021-03-02 17:30:41.624862");我得到的输出是 Tue Mar 02 17:41:05 IST 2021,这是错的吗?正确的?大约提前11分钟。为什么会这样【参考方案2】:

供将来参考:

 yyyy => 4 digit year
 MM   => 2 digit month (you must type MM in ALL CAPS)
 dd   => 2 digit "day of the month"

 HH   => 2-digit "hour in day" (0 to 23)
 mm   => 2-digit minute (you must type mm in lowercase)
 ss   => 2-digit seconds
 SSS  => milliseconds

所以“yyyy-MM-dd HH:mm:ss”返回“2018-01-05 09:49:32”

但是“MMM dd, yyyy hh:mm a”返回“Jan 05, 2018 09:49 am”

https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html 的所谓示例仅显示输出。他们不会告诉你使用什么格式!

【讨论】:

仅供参考,麻烦的 SimpleDateFormat 类已被 Java 8 和 9 中内置的 java.time 类淘汰多年。具体来说,DateTimeFormatter。应避免使用与 Java 最早版本捆绑的旧日期时间类。【参考方案3】:

tl;博士

LocalDateTime.parse( 
    "2012-07-10 14:58:00.000000".replace( " " , "T" )  
)

微秒不适合

您正试图将具有微秒(六位十进制数字)的值压缩为仅支持毫秒分辨率(三位十进制数字)的数据类型。这是不可能的。

改为使用分辨率足够高的数据类型。 java.time 类使用纳秒分辨率(九个十进制数字)。

未分区的输入不适合分区类型

您试图将缺少任何与 UTC 或时区的偏移量的值放入仅表示 UTC 值的数据类型 (Date)。因此,您正在添加输入不打算添加的信息(UTC 偏移量)。

改为使用适当的数据类型。具体来说,java.time.LocalDateTime

区分大小写

其他答案和评论正确解释了格式化模式代码区分大小写。所以MMmm有不同的效果。

避免遗留类

与最早的 Java 版本捆绑在一起的麻烦的旧日期时间类现在已被遗留,被 Java 8 及更高版本中内置的 java.time 类所取代。

ISO 8601

您的输入字符串几乎符合 ISO 8601 标准格式。将中间的空格替换为T 以完全符合要求。

java.time 类在解析/生成字符串时默认使用标准格式。所以不需要指定格式模式。

日期时间对象没有“格式”

我需要生成的日期对象具有相同的格式。

不,日期时间对象没有“格式”。不要将日期时间对象与单纯的字符串混为一谈。字符串是对象的输入和输出。对象维护自己的日期时间信息的内部表示,其细节与调用程序员无关。

java.time

您的输入缺少任何与 UTC 偏移或麻烦的 me 区域的指标。因此,我们将其解析为缺少这些概念的 LocalDateTime 对象。

String input = "2012-07-10 14:58:00.000000".replace( " " , "T" ) ;
LocalDateTime ldt = LocalDateTime.parse( input ) ;

生成字符串

要生成代表LocalDateTime 值的字符串:

调用 toString 以获取标准 ISO 8601 格式的字符串。 使用DateTimeFormatter 生成自定义格式或自动本地化格式的字符串。

搜索 Stack Overflow 以获取更多信息,因为这些主题已被多次讨论。

ZonedDateTime

LocalDateTime 确实代表时间线上的确切点。

要确定实际时刻,请指定时区。例如,印度加尔各答的中午比法国巴黎的中午要早得多。没有时区的中午可能发生在大约 26-27 小时范围内的任何时间点。

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。 Hibernate 5 & JPA 2.2 支持 java.time

从哪里获取 java.time 类?

Java SE 8Java SE 9Java SE 10Java SE 11 和更高版本 - 具有捆绑实现的标准 Java API 的一部分。 Java 9 带来了一些小功能和修复。 Java SE 6Java SE 7 大部分 java.time 功能在ThreeTen-Backport 中向后移植到 Java 6 和 7。 Android java.time 类的更高版本的 android (26+) 捆绑实现。 对于早期的 Android (API desugaring 的进程带来了最初未内置于 Android 中的subset of the java.time 功能。 如果脱糖不能满足您的需求,ThreeTenABP 项目会将ThreeTen-Backport(如上所述)适配到 Android。见How to use ThreeTenABP…

【讨论】:

【参考方案4】:

您没有应用日期格式化程序。相反,您只是在解析日期。以这种格式获得输出

yyyy-MM-dd HH:mm:ss.SSSSSS

我们必须使用 format() 方法,这里是完整的例子:- 这是完整的示例:- 它将采用这种格式的日期yyyy-MM-dd HH:mm:ss.SSSSSS 结果我们将得到与此格式相同的输出yyyy-MM-dd HH:mm:ss.SSSSSS

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

//TODO OutPut should LIKE in this format yyyy-MM-dd HH:mm:ss.SSSSSS.
public class TestDateExample 

public static void main(String args[]) throws ParseException 

    SimpleDateFormat changeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");

    java.util.Date temp = changeFormat.parse("2012-07-10 14:58:00.000000");
     Date thisDate = changeFormat.parse("2012-07-10 14:58:00.000000");  
    System.out.println(thisDate);
    System.out.println("----------------------------"); 
    System.out.println("After applying formating :");
    String strDateOutput = changeFormat.format(temp);
    System.out.println(strDateOutput);




【讨论】:

【参考方案5】:

它对我有用 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf.format(新日期));

【讨论】:

以上是关于格式为“yyyy-mm-dd HH:mm:ss”的 Java 字符串到日期对象的主要内容,如果未能解决你的问题,请参考以下文章

将日期解析为 yyyy-MM-dd HH:mm:ss 格式 [重复]

Java 格式 yyyy-MM-dd'T'HH:mm:ss.SSSz 转 yyyy-mm-dd HH:mm:ss

格式为“yyyy-mm-dd HH:mm:ss”的 Java 字符串到日期对象

Oracle 中的时间戳转换为 YYYY-MM-DD HH:MM:SS 格式

为啥我无法解析这种日期格式 yyyy-MM-dd'T'HH:mm:ss.SSSZ?

vue实时显示当前时间且转化为“yyyy-MM-dd hh:mm:ss”格式