小编典典

Java 字符串到日期的转换

all

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

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

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

将日期转换为时间。


阅读 132

收藏
2022-02-28

共1个答案

小编典典

这是一种艰难的方式,并且这些java.util.Datesetter 方法自 Java 1.1 (1997) 以来已被弃用。此外,自Java 8
(2014) 中引入 API以来,整个java.util.Date类实际上已被弃用(不推荐)。java.time

只需使用DateTimeFormatter与输入字符串匹配的模式来格式化日期(教程可在此处获得)。

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

  1. “一月”是全文月份,所以使用MMMM它的模式
  2. “2”是一个月中的短日,所以使用d它的模式。
  3. “2010”是 4 位数的年份,所以使用yyyy它的模式。

    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相关性的摘录,列出了所有可用的格式模式:

象征 意义 介绍 例子
`G` 时代 文本 广告; 公元; 一种
`u` 2004;04
`y` 年代 2004;04
`D` 一年中的一天 数字 189
`M`/`L` 一年中的一个月 号码/文字 7; 07; 七月; 七月; Ĵ
`d` 日期 数字 10
`Q`/`q` 季度 号码/文字 3;03; Q3; 第三季度
`Y` 以周为基础的年 1996;96
`w` 以周为基础的年 数字 27
`W` 每周 数字 4
`E` 星期几 文本 周二;周二; 吨
`e`/`c` 本地化星期几 号码/文字 2;02; 周二;周二; 吨
`F` 每周 数字 3
`a` 上午-下午 文本 下午
`h` 时钟时间-上午-下午 (1-12) 数字 12
`K` 上午-下午 (0-11) 数字 0
`k` 时钟时间-上午-下午 (1-24) 数字 0
`H` 一天中的小时 (0-23) 数字 0
`m` 一分钟 数字 30
`s` 分秒 数字 55
`S` 几分之一秒 分数 978
`A` 毫日 数字 1234
`n` 纳秒 数字 987654321
`N` 毫微日 数字 1234000000
`V` 时区标识 区号 美国/洛杉矶;Z; -08:30
`z` 时区名称 区域名称 太平洋标准时间;太平洋标准时间
`O` 局部区域偏移 偏移量-O 格林威治标准时间+8;格林威治标准时间+08:00;UTC-08:00;
`X` 区域偏移“Z”为零 偏移量-X Z; -08; -0830; -08:30;-083015; -08:30:15;
`x` 区域偏移 偏移量-x +0000; -08; -0830; -08:30;-083015; -08:30:15;
`Z` 区域偏移 偏移-Z +0000; -0800; -08:00;

请注意,它为更流行的模式提供了几个预定义的格式化程序。因此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)。


Java 8 之前

如果您还没有使用 Java
8,或者被迫使用,请使用与输入字符串匹配的格式模式来java.util.Date格式化日期。SimpleDateFormat

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相关性的摘录,列出了所有可用的格式模式:

信件 日期或时间组件 介绍 例子
`G` 时代代号 文本 广告
`y` 1996;96
`Y` 周年 2009; 09
`M`/`L` 一年中的月份 七月; 七月; 07
`w` 一年中的一周 数字 27
`W` 一个月的一周 数字 2
`D` 一年中的一天 数字 189
`d` 一个月中的一天 数字 10
`F` 月中的星期几 数字 2
`E` 一周中的一天 文本 周二; 周二
`u` 星期几 数字 1
`a` 上午/下午标记 文本 下午
`H` 一天中的小时 (0-23) 数字 0
`k` 一天中的小时 (1-24) 数字 24
`K` 上午/下午小时 (0-11) 数字 0
`h` 上午/下午小时 (1-12) 数字 12
`m` 一小时一分钟 数字 30
`s` 一分钟秒 数字 55
`S` 毫秒 数字 978
`z` 时区 一般时区 太平洋标准时间;太平洋标准时间; GMT-08:00
`Z` 时区 RFC 822 时区 -0800
`X` 时区 ISO 8601 时区 -08; -0800; -08:00

请注意,模式区分大小写,四个或更多字符的基于文本的模式代表完整形式;否则,如果可用,则使用简短或缩写形式。因此,例如MMMMM或更多是不必要的。

SimpleDateFormat以下是解析给定字符串的一些有效模式示例:

输入字符串 图案
2001.07.04 AD 12:08:56 PDT `yyyy.MM.dd G 'at' HH:mm:ss z`
01 年 7 月 4 日,星期三 `EEE, MMM d, ''yy`
下午 12:08 `h:mm a`
太平洋夏令时间下午 12 点 `hh 'o''clock' a, zzzz`
太平洋夏令时间下午 0:08 `K:mm a, z`
02001.July.04 AD 12:08 PM `yyyyy.MMMM.dd GGG hh:mm aaa`
2001 年 7 月 4 日,星期三 12:08:56 -0700 `EEE, d MMM yyyy HH:mm:ss Z`
010704120856-0700 `yyMMddHHmmssZ`
2001-07-04T12:08:56.235-0700 `yyyy-MM-dd'T'HH:mm:ss.SSSZ`
2001-07-04T12:08:56.235-07:00 `yyyy-MM-dd'T'HH:mm:ss.SSSXXX`
2001-W27-3 `YYYY-'W'ww-u`

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

2022-02-28