在Java字符串中更改日期格式
在Java字符串中更改日期格式
我有一个代表日期的String。\nString date_s = \"2011-01-18 00:00:00.0\";\n我想将其转换为Date并以YYYY-MM-DD格式输出。\n2011-01-18\n我该如何实现这一点?\n
\n好的,根据下面的答案,我尝试了以下内容:\nString date_s = \" 2011-01-18 00:00:00.0\";\nSimpleDateFormat dt = new SimpleDateFormat(\"yyyyy-mm-dd hh:mm:ss\");\nDate date = dt.parse(date_s);\nSimpleDateFormat dt1 = new SimpleDateFormat(\"yyyyy-mm-dd\");\nSystem.out.println(dt1.format(date));\n但是它输出了02011-00-1,而不是期望的2011-01-18。我做错了什么?
问题的原因是代码中使用的日期格式不正确。在代码中,使用了"yyyyy-mm-dd hh:mm:ss"的格式来解析日期字符串,但实际上应该使用"yyyy-MM-dd hh:mm:ss"的格式。这导致解析出来的日期不正确,进而导致格式化后的日期也不正确。
解决方法是修改代码中的日期格式为正确的格式。将"yyyyy-mm-dd hh:mm:ss"改为"yyyy-MM-dd hh:mm:ss",然后再运行代码即可得到正确的输出。
以下是修改后的代码:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class FormateDate { public static void main(String[] args) throws ParseException { String date_s = "2011-01-18 00:00:00.0"; // *** note that it's "yyyy-MM-dd hh:mm:ss" not "yyyy-mm-dd hh:mm:ss" SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Date date = dt.parse(date_s); // *** same for the format String below SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd"); System.out.println(dt1.format(date)); } }
修改后的代码使用了正确的日期格式,输出结果将会是"2011-01-18"。
问题出现的原因是日期格式化对大小写敏感,所以要使用大写的MM表示月份,而不是小写的mm(小写的mm表示分钟)。解决方法是根据给出的参考文档使用正确的格式代码。
日期格式化的代码如下:
G 时代标识符 文本 AD
y 年份 年份 1996; 96
Y 周年份 年份 2009; 09
M 一年中的月份 月份 July; Jul; 07
w 一年中的周数 数字 27
W 一个月中的周数 数字 2
D 一年中的天数 数字 189
d 一个月中的天数 数字 10
F 一个月中的星期几 数字 2
E 星期几的名称 文本 Tuesday; Tue
u 一周中的天数(1 = 星期一,...,7 = 星期天) 数字 1
a 上午/下午标记 文本 PM
H 一天中的小时数(0-23) 数字 0
k 一天中的小时数(1-24) 数字 24
K 上午/下午的小时数(0-11) 数字 0
h 上午/下午的小时数(1-12) 数字 12
m 小时中的分钟数 数字 30
s 分钟中的秒数 数字 55
S 毫秒 数字 978
z 时区 通用时区 Pacific Standard Time; PST; GMT-08:00
Z 时区 RFC 822时区 -0800
X 时区 ISO 8601时区 -08; -0800; -08:00
以下是一些示例:
"yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT "EEE, MMM d, ''yy" Wed, Jul 4, '01 "h:mm a" 12:08 PM "hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time "K:mm a, z" 0:08 PM, PDT "yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM "EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700 "yyMMddHHmmssZ" 010704120856-0700 "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" 2001-07-04T12:08:56.235-0700 "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" 2001-07-04T12:08:56.235-07:00 "YYYY-'W'ww-u" 2001-W27-3
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 应该是 "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",如果在Z前后加上单引号,则会输出字母Z,否则会输出时区。例如,2014-08-14T01:24:57.236Z 和 2014-08-14T01:24:57.236-0530,我在jdk1.7上测试过。
"yyyyy.MMMMM.dd GGG hh:mm aaa" 中的月份多了一个M,应该使用四个M而不是五个!
如果是四个或更多的字母,则使用完整形式。所以你可以使用4次m甚至5次m,效果是一样的。
这个回答几乎是复制粘贴文档的内容,没有提供额外的解释,并且没有提供获取更多信息的文档链接。-1。(这是文档的链接)
非常有用,谢谢。
这是我在Java中使用日期格式化器找到的最满意的答案。非常感谢。
在Android中,MMMMM
对我无效,但MMMM
有效。
谢谢,非常好用!我需要使用yyyy-MM-dd'T'HH:mm:ssXXX
。
在Java中更改日期格式的问题是因为需要将一个字符串按照特定的格式解析为日期,并将日期按照特定的格式转换为字符串。
解决方法有两种:
1. 使用`LocalDateTime#parse()`方法将字符串按照指定的格式解析为`LocalDateTime`对象,然后使用`LocalDateTime#format()`方法将`LocalDateTime`对象按照指定的格式转换为字符串。
String oldstring = "2011-01-18 00:00:00.0"; LocalDateTime datetime = LocalDateTime.parse(oldstring, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S")); String newstring = datetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); System.out.println(newstring); // 2011-01-18
2. 如果使用的是Java 8之前的版本,可以使用`SimpleDateFormat#parse()`方法将字符串按照指定的格式解析为`Date`对象,然后使用`SimpleDateFormat#format()`方法将`Date`对象按照指定的格式转换为字符串。
String oldstring = "2011-01-18 00:00:00.0"; Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").parse(oldstring); String newstring = new SimpleDateFormat("yyyy-MM-dd").format(date); System.out.println(newstring); // 2011-01-18
需要注意的是,格式字符串中的部分字符是大小写敏感的,例如`M`表示月份,`m`表示分钟。同时,年份应该是四位数的`yyyy`,而不是五位数的`yyyyy`。
如果需要将日期格式化为"Monday 1st September 2012"这样的形式,可以根据Java文档中的字符说明来调整格式字符串。
如果使用的是Java 8之前的版本,可以考虑使用ThreeTen Backport库或者ThreeTenABP库来支持新的日期和时间API。