使用Java将自定义日期字符串(带有AM/PM)转换为UTC日期时间



我只需要示例代码块或建议将以下日期字符串以格式转换为UTC时间yyyy-mm-dd hh:mm:ss?

样本日期字符串:11/23/2017 09:44 AM

有类似的问题,但我的测试数据是在AM/PM上。因此,请不要将其视为重复

您可以使用Java 8 time软件包:

String input = "11/23/2017 09:44am";
String format = "MM/dd/yyyy hh:mma";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
LocalDateTime date = LocalDateTime.parse(input, formatter);
System.out.printf("%s%n", date);

,但问题是:由于小写'am'。

,这引发了DateTimeParseException

我在文档中抬起头来,但是我看不到一种标准方法来解析小写'am'或'pm',如Meridiem指示者 1 您最终会手动替换它们:

input = input.replace("AM", "am").replace("PM","pm");

@olevv在评论中提到的,您可以使用 DateTimeFormatterBuilder并指定解析应该对情况不敏感:

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
    .parseCaseInsensitive()
    .appendPattern(format)
    .toFormatter();

然后,您可以将此格式化作为LocalDateTime.parse方法的参数。

上述帖子的另一个答案提供了一个解决方案,您可以在其中覆盖AM/PM符号的小写型号。


1 有趣的是, SimpleDateFormat dis 支持小写AM/pm的解析。

下面的示例代码应正确进行转换。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateConversion {
    public static void main(String[] argv) {
        SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mma");
        SimpleDateFormat OutputFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String sampleDateString = "11/23/2017 09:44am";
        try {
            Date convertDate = formatter.parse(sampleDateString);
            System.out.println(OutputFormatter.format(convertDate));
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

这是声明要解析的日期字符串。

 SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mma");

和输出日期

SimpleDateFormat OutputFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

首先,您需要使用适当的模式创建一个SimpleDateFormat。此课程可帮助您将字符串解析为java.util.Date(更多信息在此处):

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yy hh:mma");

如果您的原始字符串日期位于特殊时区中,则需要指示解析器使用此时区:

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yy hh:mma", Locale.ENGLISH);

然后,您需要将字符串解析为日期:

Date d = sdf.parse("11/23/2017 09:44am");

finnaly您必须将时区的日期转换为UTC。

请找到Bellow完整代码段:

public static void main(String[] args) throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yy hh:mma", Locale.ENGLISH);
    Date d = sdf.parse("11/23/2017 09:44am");
    System.out.println(toUtcZonedDateTime(d));
}
public static ZonedDateTime toUtcZonedDateTime(final Date date) {
    if (date == null) {
        return null;
    }
    final ZoneId utcZone = ZoneOffset.UTC;
    return ZonedDateTime.ofInstant(date.toInstant(), utcZone);
}

输出:

2017-11-23T08:44Z

SimpleDateFormat的Javadoc列出了所有选项,包括AM/PM标记的" A"。

在您的情况下,您需要:

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm:ssa")

最新更新