格式为“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.Date
、java.util.Calendar
和 java.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
。
区分大小写
其他答案和评论正确解释了格式化模式代码区分大小写。所以MM
和mm
有不同的效果。
避免遗留类
与最早的 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.Date
、Calendar
和 SimpleDateFormat
。
要了解更多信息,请参阅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 8、Java SE 9、Java SE 10、Java SE 11 和更高版本 - 具有捆绑实现的标准 Java API 的一部分。 Java 9 带来了一些小功能和修复。 Java SE 6 和 Java 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 格式