在Java中解析日期和时间

5

我有一个时间格式为 (yyyy-mm-ddTHH:mm+0:0000)。我需要使用Java程序将此格式转换为 mm-dd-yyyy hh:mm am/pm 的格式。请帮助我完成这个任务。提前感谢您的帮助。


所以你有一个字符串,想要将它转换成另一个字符串? - Bozho
你能解释得更详细一些吗?这个字符串是从哪里来的?XML文件中?它要去哪里?Swing GUI界面中? - Puce
6个回答

11

尝试像这样:

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);

1
在第二种格式中,它采用当前(本地)时区。如果您不想使用默认时区,则可以提供自己的时区。 - Paŭlo Ebermann

5
这是现代的答案。当这个问题被提出时,SimpleDateFormat是正确的答案,但现在不再是了。旧的类被证明很棘手,因此它们的替代品在2014年初终于推出。
我对你的格式有一些疑惑。
  • yyyy-mm-ddTHH:mm+0:0000看起来有点像ISO 8601偏移日期时间,但是+0:0000应该是与UTC的偏移量。我猜测它可能是以h:mmss格式的偏移量,但这是非标准的,在其他地方我从未见过。
  • 你似乎要求小写的am/pm。这也是非标准的,并且不是标准类内置的。
我建议:
    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偏移量的规定。这种方法也适用于其他偏移量(只要小时是一位数字即可;您可以尝试逐个测试一位数字和两位数字)。在具体的代码中,我们仍然忽略了格式化时的偏移量,但如果需要,它可以用于其他目的。

DateTimeFormatterLocalDateTimeOffsetDateTime是JSR-310的一部分。它们在Java 8及更高版本中内置。您还可以通过ThreeTen Backport在Java 6和7中使用它们。另外还有一个专门为Android设计的后端,ThreeTenABP


2

看看java.text.SimpleDateFormat - 你需要两个实例,一个用于解析,一个用于格式化。


1

请查看此代码片段的工作示例:

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));
}

}


0
你可以按照 Paulo 和 morja 的建议去做,或者直接使用 String.substring() 方法,因为你的解析需求非常简单。

OP 询问了“上午”或“下午”。我认为通过子字符串获取这些并不可行。 - Ole V.V.

0
你应该从你的字符串创建一个数据对象 -> 使用适当的类(例如SimpleDataFormat),然后使用另一种格式打印它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接