/*I want the same Date of my String has
Tried with couple of options but nothing worked
pasting some of code here */
public void stringToDate() {
//Current format "13-FEB-20 03.21.08.100000000 PM" in Melbourne Timezone
//Required Format yyyy-dd-MM HH:mm:ss.SSS in Melbourne Timezone
String inputAM = "13-FEB-20 03.21.08.100000000 PM";
try {
DateFormat df1 = new SimpleDateFormat("dd-MMM-yy hh.mm.ss.S aa");
Date d1 = df1.parse(inputAM);
System.out.println("Date-1: " + d1); //Fri Feb 14 19:07:48 AEDT 2020
DateFormat df2 = new SimpleDateFormat("DD-MMM-yy hh.mm.ss.S aa");
Date d2 = df2.parse(inputAM);
System.out.println("Date-2: " + d2); //Tue Jan 14 19:07:48 AEDT 2020
} catch (ParseException e) {
e.printStackTrace();
}
SimpleDateFormat etDf = new SimpleDateFormat("yyyy-dd-MM HH:mm:ss.SSS");
TimeZone etTimeZone = TimeZone.getTimeZone("Australia/Melbourne");
etDf.setTimeZone(etTimeZone);
DateFormat df3 = new SimpleDateFormat("dd-MMM-yy HH.mm.ss.SSSSSSSSS a");
Date d3;
try {
d3 = df3.parse(inputAM);
System.out.println("Date-3: " + d3); //Fri Feb 14 07:07:48 AEDT 2020
System.out.println("Date-4: " + etDf.format(d3.getTime())); //2020-14-02 07:07:48.000
} catch (ParseException e) {
e.printStackTrace();
}
}发布于 2020-02-26 16:10:58
首先,在大多数情况下,不要将日期和时间从一种字符串格式转换为另一种字符串格式。在您的程序中,将日期和时间作为适当的日期-时间对象,而不是字符串。当您接受字符串输入时,首先要对其进行解析。仅当您需要提供字符串输出时,才将日期时间格式化为所需格式的字符串。
其次,对所有日期和时间工作使用java.time,这是现代Java date and time API。与旧的、设计糟糕的和长期过时的类(包括DateFormat、SimpleDateFormat和Date )相比,使用它要好得多。
使用java.time解析您的输入
//Current format "13-FEB-20 03.21.08.100000000 PM" in Melbourne Timezone
DateTimeFormatter currentFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("d-MMM-uu hh.mm.ss.SSSSSSSSS a")
.toFormatter(Locale.ENGLISH);
ZoneId zone = ZoneId.of("Australia/Melbourne");
String inputAM = "13-FEB-20 03.21.08.100000000 PM";
ZonedDateTime dateTime = LocalDateTime.parse(inputAM, currentFormatter).atZone(zone);
System.out.println(dateTime);到目前为止,输出是:
2020-02-13T15:21:08.100+11:00Australia/Melbourne
使用java.time格式化
//Required Format yyyy-dd-MM HH:mm:ss.SSS in Melbourne Timezone
DateTimeFormatter requiredFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS");
String formatted = dateTime.format(requiredFormatter);
System.out.println(formatted);2020-02-13 15:21:08.100
你的代码出了什么问题?
当我第一次尝试您的代码时,解析FEB失败了,因为您的代码没有指定地区,而我的Java使用了非英语的默认地区。
更正后,我能够解析字符串,并获得与您相同的结果(仅在我的时区)。结果:无论要解析的字符串中有多少个S,无论字符串中有多少位数字,SimpleDateFormat都会采用大写S来表示毫秒,千分之一秒。因此,将100,000,000毫秒添加到您的日期和时间。这是一天多一点的时间。所以你得到的是14号而不是13号,而且一天中的时间也不对。与现代的DateTimeFormatter大写形式不同,S表示秒的分数,因此它以我们期望的方式同时处理SSSSSSSSS和SSS。
大写的DD表示一年中的某一天,所以使用它来解析你得到了一年中的第13天(与1月13日相同)加上你的100000秒。
大写HH表示从00到23的一天中的小时。使用HH解析得到的结果是一天中的03:21 (与凌晨03:21相同),再加上100000秒,不管字符串中写的是PM。
链接
https://stackoverflow.com/questions/60408294
复制相似问题