Java字符串到日期的转换? 推荐| Java Debug 笔记

678 阅读4分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接

Java字符串到日期的转换

将Java中String“ 2010年1月2日”格式的a转换为a的最佳方法是什么Date?

最终,我想将月份,日期和年份分解为整数,以便可以使用

Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();

将日期转换为时间。

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}

那是困难的方法,并且java.util.Date自Java 1.1(1997)开始不赞成使用这些setter方法。只需SimpleDateFormat使用与输入字符串匹配的格式模式来格式化日期。

在特定情况下,“ 2010年1月2日”作为输入字符串:

   “一月”是全文月份,因此请使用MMMM模式
    “ 2”是较短的月份,因此请使用d模式。
    “ 2010”是4位数字的年份,因此请使用yyyy模式。
String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010

注意显式Locale参数的重要性。如果您省略它,那么它将使用默认语言环境,该语言环境不一定是输入字符串的月份名称中使用的英语。如果语言环境与输入字符串不匹配,那么java.text.ParseException即使格式模式似乎有效,您也可能会困惑地得到一个。

以下是javadoc的相关摘录,列出了所有可用的格式模式:

图片.png 请注意,这些模式区分大小写,并且四个或更多字符的基于文本的模式代表完整形式;否则,使用简短形式或缩写形式(如果可用)。因此,例如MMMMM不需要更多。

以下是一些有效SimpleDateFormat模式的示例,这些模式可用来解析迄今为止的给定字符串: 输入字串 图案

图片.png

一个重要的注意的是,SimpleDateFormat是不是线程安全的。换句话说,永远不要声明并将其分配为静态变量或实例变量,然后再从其他方法/线程中重用它。您应该始终在方法本地范围内全新创建它。

Java 8更新

如果您恰巧是Java 8或更高版本的用户,请使用DateTimeFormatter(也在此处,单击链接以查看所有预定义的格式化程序和可用的格式模式;该教程在此处可用)。这个新的API受到JodaTime的启发。

String string = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2010-01-02

注意:如果您的格式模式也恰好包含时间部分,请使用LocalDateTime#parse(text, formatter)代替LocalDate#parse(text, formatter)。并且,如果您的格式模式也恰好包含时区,请ZonedDateTime#parse(text, formatter)改用。

以下是javadoc的相关摘录,列出了所有可用的格式模式:

图片.png

图片.png

请注意,它具有一些用于更流行模式的预定义格式器。

因此DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);

可以代替使用DateTimeFormatter.RFC_1123_DATE_TIME。这是可能的,因为与SimpleDateFormat线程安全相反,它们是线程安全的。因此,如果需要,您也可以定义自己的名称。

对于特定的输入字符串格式,您不需要使用显式的DateTimeFormatter:标准ISO 8601日期(例如2016-09-26T17:44:57Z)可以直接解析,LocalDateTime#parse(text)因为它已经使用了ISO_LOCAL_DATE_TIME格式化程序。同样,LocalDate#parse(text)解析没有时间部分的ISO日期(请参阅ISO_LOCAL_DATE),并ZonedDateTime#parse(text)解析添加了偏移量和时区的ISO日期(请参阅ISO_ZONED_DATE_TIME)。

文章翻译自 am2dgbqfb6mk75jcyanzabc67y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/4…

作者建议: 文章说的已经很好了,当然也可以通过Threadlocal来解决SimpleDateFormat作为static 对象背多个线程调用时造成的线程不安全的情况, 这会使用ThreadLocal来限制SimpleDateFormat只能在线程内共享

欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!! \color{red}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!!{~}

有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️