使用SimpleDateFormat,如何解析字符串:“2013-05-23T09:18:07 p.m..380 + 0000”
我的所有SimpleDateFormat字符串都在“p.m。”部分绊倒。
提前致谢。
编辑:我们无法控制进入的格式。
我试过了:
"yyyy-MM-dd'T'HH:mm:ss a.a..SSSZ"
"yyyy-MM-dd'T'HH:mm:ss aaaa.SSSZ"
"yyyy-MM-dd'T'HH:mm:ss a.'m'..SSSZ"
"yyyy-MM-dd'T'HH:mm:ss a.'m.'.SSSZ"
"yyyy-MM-dd'T'HH:mm:ss a.'m..'SSSZ"
"yyyy-MM-dd'T'HH:mm:ss aa'm'..SSSZ"
"yyyy-MM-dd'T'HH:mm:ss aa'm.'.SSSZ"
"yyyy-MM-dd'T'HH:mm:ss aaa'..'SSSZ"
"yyyy-MM-dd'T'HH:mm:ss aaa.'.'SSSZ"
"yyyy-MM-dd'T'HH:mm:ss aaa'.'.SSSZ"
答案 0 :(得分:13)
目前尚不清楚“380 + 0000”部件的含义,但您可以通过设置DateFormatSymbols
的{{1}}来修复AM / PM部件。这是一个例子:
SimpleDateFormat
我不知道你是否 克隆import java.util.*;
import java.text.*;
public class Test {
public static void main(String[] args) throws Exception {
String text = "2013-05-23T09:18:07 p.m..380+0000";
String pattern = "yyyy-MM-dd'T'hh:mm:ss aa'.380+0000'";
SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));
DateFormatSymbols symbols = format.getDateFormatSymbols();
symbols = (DateFormatSymbols) symbols.clone();
symbols.setAmPmStrings(new String[] { "a.m.", "p.m."});
format.setDateFormatSymbols(symbols);
Date date = format.parse(text);
System.out.println(date);
}
}
之后才变异 - 它不清楚,说实话...... documentation指出两种方式:
DateFormatSymbols对象是可复制的。获取DateFormatSymbols对象时,可以随意修改日期时格式化数据。例如,您可以将本地化的日期时间格式模式字符替换为您容易记住的字符。或者您可以将代表性城市更改为您最喜欢的城市。
鉴于它提到了克隆,这表明你应该克隆 - 但随后的段落建议不要:(
答案 1 :(得分:2)
这是使用Java 8的新java.time
包的实现,因此您可以放弃java.util.Date
和java.text.SimpleDateFormat
:
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
String text = "2013-05-23T09:18:07 p.m..380+0000";
Map<Long, String> map = new HashMap<>();
map.put(0L, "a.m.");
map.put(1L, "p.m.");
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd'T'hh:mm:ss ")
.appendText(ChronoField.AMPM_OF_DAY, map)
.appendPattern(".SSSZ").toFormatter();
OffsetDateTime dateTime = OffsetDateTime.parse(text, formatter);
System.out.println(dateTime);
}
}
运行它会产生:
2013-05-23T21:18:07.380Z
答案 2 :(得分:0)
只需删除下午。部分通过字符串操作。这是多余的。
比使用简单的SimpleDateFormat进行解析。
这些方面的东西:
String whatever = "2013-05-23T09:18:07 p.m..380+0000";
whatever = whatever.replaceAll(" p.m..", ":").replaceAll(" a.m..", ":");
System.out.println(whatever);
S
String pattern = "yyyy-MM-dd'T'hh:mm:ss:SSS'Z'";
SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.US);
Date date;
try {
date = format.parse(whatever);
System.out.println(date);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
<强>更新强>
正如IAN指出的那样,我错过了时间不是24小时格式。 然而,我确实得到了毫秒部分的正确性,并将时区部分添加到Jon Skeet得到的答案:
String text = "2013-05-23T09:18:07 p.m..380+0000";
String pattern = "yyyy-MM-dd'T'hh:mm:ss aa'.'SSSZ";
SimpleDateFormat format = new SimpleDateFormat(pattern);
DateFormatSymbols symbols = format.getDateFormatSymbols();
symbols = (DateFormatSymbols) symbols.clone();
symbols.setAmPmStrings(new String[] { "a.m.", "p.m."});
format.setDateFormatSymbols(symbols);
Date date = format.parse(text);
System.out.println(date);
答案 3 :(得分:0)
这样做
String time="2013-05-23T09:18:07 p.m..380+0000";
int index1=time.indexOf("");
int index2 = time.indexOf(".."); // or you can give p.m. as argument if you want it to stop before pm
String result = time.substring(index1,index2);
System.out.print(result);
这具有以下结果
2013-05-23T09:18:07 p.m
我希望这会有所帮助