将时间转换为阿拉伯时区

时间:2017-04-03 13:37:32

标签: java android datetime

我有一个将时间转换为其他时区的工作示例,但没有阿拉伯

试过很多方法,但总是得到“java.text.ParseException:Unparseable date:”2017-03-21 14:35:43“(在偏移5处)”

我做错了什么?

这是我的代码:

      public String convertTime(String inputTime) {
    try {

        //first block, that works
        /*SimpleDateFormat sourceFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        sourceFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
        Date parsed = sourceFormat.parse(inputTime); // => Date is in UTC now

        TimeZone tz = TimeZone.getDefault();
        SimpleDateFormat destFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        destFormat.setTimeZone(tz);

        return destFormat.format(parsed);*/

        //another effort, not working 
        DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);
        Date myDate = df.parse(inputTime);
        String testTime = DateFormat.getDateInstance().format(myDate);
        return testTime;
    } catch (Exception e) {
        System.out.println(e.getMessage());
        return "61:61";
    }
}

2 个答案:

答案 0 :(得分:4)

尝试:

 public static String dateFormatter(Date postDate){

    String pattern = "yyyy-MM-dd HH:mm:ss";
    SimpleDateFormat format = new SimpleDateFormat(pattern);
    { format.setTimeZone(TimeZone.getTimeZone("GTM+5"));}
    String date = format.format(postDate);
    return date;
}

答案 1 :(得分:2)

你做错了什么?首先,您的注释掉的代码在我的计算机上运行良好,我认为没有什么问题。它会将您问题中的输入字符串2017-03-21 14:35:43转换为计算机时区中的相应时间。

您的“另一种努力,不工作”,您依赖于依赖于语言环境的格式。对于像DateFormat这样的宽松类,这很危险。如果没有日期格式告诉你,你就有可能出现问题。在我的计算机上,您的代码提供07-09-2026,这意味着2026年9月7日,显然是错误的。添加Locale参数可能是一种改进,例如:DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.ROOT)。现在我得到Unparseable date: "2017-03-21 14:35:43"。此格式预期输入为3/21/2017 2:35 PM(没有秒数)。至少它现在告诉我们它不起作用。如果您的计算机设置为某种阿拉伯语语言环境,我认为会出现类似的格式。试着举例System.out.println(df.format(new Date()));来查找。

尽管如此,如果可以的话,你可以跳过旧的SimpleDateFormatTimeZoneDateDateFormat来帮助自己。 Java 8中引入的日期和时间类设计得更好,更好,更方便使用,并且在许多情况下更适合我们想要使用它们的任何内容。我会写:

private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");

public static String convertTime(String inputTime) {
    ZoneId destinationTimeZone = ZoneId.of("Asia/Riyadh");
    return LocalDateTime.parse(inputTime, formatter)
            .atOffset(ZoneOffset.UTC)
            .atZoneSameInstant(destinationTimeZone)
            .format(formatter);
}

使用输入字符串2017-03-21 14:35:43,这会产生2017-03-21 17:35:43。请在方法的第一行插入您想要的时区。例如,如果您要使用计算机的时区设置,请使用ZoneId.systemDefault()

它是如何工作的?该方法解析输入,以UTC格式解释,在阿拉伯时区找到相应的时间,并使用相同的格式将其格式化。

如果无法解析输入字符串,

LocalDateTime.parse()将抛出DateTimeParseException,因此您可能希望捕获此信息并采取相应措施。不要只是抓住Exception,这是不好的做法,会让你不知道出了什么问题。