我有一个时间格式为 (yyyy-mm-ddTHH:mm+0:0000)。我需要使用Java程序将此格式转换为 mm-dd-yyyy hh:mm am/pm 的格式。请帮助我完成这个任务。提前感谢您的帮助。
尝试像这样:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm+s:SSSS");
Date date = format.parse(dateString);
format = new SimpleDateFormat("MM-dd-yyyy hh:mm a");
dateString = format.format(date);
SimpleDateFormat
是正确的答案,但现在不再是了。旧的类被证明很棘手,因此它们的替代品在2014年初终于推出。yyyy-mm-ddTHH:mm+0:0000
看起来有点像ISO 8601偏移日期时间,但是+0:0000
应该是与UTC的偏移量。我猜测它可能是以h:mmss
格式的偏移量,但这是非标准的,在其他地方我从未见过。 DateTimeFormatter sourceFormat
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm'+0:0000'");
DateTimeFormatter targetFormat
= DateTimeFormatter.ofPattern("MM-dd-uuuu hh:mm a", Locale.ENGLISH);
String sourceTime = "2017-07-05T20:31+0:0000";
String convertedTime = LocalDateTime.parse(sourceTime, sourceFormat)
.format(targetFormat)
.toLowerCase(Locale.ENGLISH);
System.out.println(convertedTime);
这将打印
07-05-2017 08:31 pm
我发现最安全的方法是在输入时要求使用文字字面量+0:0000
,而不是试图解释它。为了将pm
转换为小写形式,我在格式化后将整个字符串转换为小写形式。在此答案中有一个不同的技巧。
更灵活地处理偏移量中的小时、分钟和秒,并使它们有意义的尝试可能是:
sourceTime = sourceTime.replaceFirst("(\\d:\\d{2})(\\d{2})$", "0$1:$2");
String convertedTime = OffsetDateTime.parse(sourceTime)
.format(targetFormat)
.toLowerCase(Locale.ENGLISH);
replaceFirst
方法将0:0000
转换为00:00:00
,并且在前面加上+
或-
符号,可以符合ISO 8601偏移量的规定。这种方法也适用于其他偏移量(只要小时是一位数字即可;您可以尝试逐个测试一位数字和两位数字)。在具体的代码中,我们仍然忽略了格式化时的偏移量,但如果需要,它可以用于其他目的。
DateTimeFormatter
、LocalDateTime
和OffsetDateTime
是JSR-310的一部分。它们在Java 8及更高版本中内置。您还可以通过ThreeTen Backport在Java 6和7中使用它们。另外还有一个专门为Android设计的后端,ThreeTenABP。
看看java.text.SimpleDateFormat
- 你需要两个实例,一个用于解析,一个用于格式化。
请查看此代码片段的工作示例:
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTimeAMPM {
public static void main(String[] args) throws ParseException {
DateFormat inputDateFormatter = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm+s:SSSS");
Date date = inputDateFormatter.parse("2011-11-11T22:33+0:400");
String outputDateFormatter = "MM-dd-yyyy HH:mm:ss a";
SimpleDateFormat sdf = new SimpleDateFormat(outputDateFormatter);
System.out.println("Date: " + sdf.format(date));
}
}