2017-04-03 27 views
-1

我得到了一个工作示例转换时间到其他时区,但没有一个阿拉伯转换时间阿拉伯时区

尝试过很多办法,但总是有“java.text.ParseException:无法解析的日期:” 2017年3月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"; 
    } 
} 
+3

'DateFormat.SHORT'为该文件读取 – njzk2

+0

已注释的代码在我的电脑上很好地工作,将'2017-03-21 14:35:43'转换为计算机时区的相应时间(天堂'尽管将电脑的时区设置为阿拉伯)。 –

+0

你说阿拉伯时区,你的意思是利雅得(阿拉伯标准时间/阿拉伯日光时间)?或者,也许你的电脑的时区设置将足够好,无论那是什么? –

回答

2

你做了什么错?首先,你的注释代码在我的电脑上很好地工作,我没有看到真正的错误。它将输入字符串2017-03-21 14:35:43从您的问题转换为计算机时区中的相应时间。

你的“另一个努力,不工作”,你依赖于一个区域依赖格式。这对于像DateFormat这样的宽松类别是很危险的。如果没有日期格式告诉你,你就有一切机会出现问题。在我的电脑上,你的代码给出07-09-2026,这意味着2026年9月7日,显然是错误的。增加一个参数可能是一个改进,例如: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,这是不好的做法,并会让你不知道哪里出了问题。

+0

无需通过示例代码中的'ZoneOffset.UTC'和'OffsetDateTime'。通过调用['LocalDateTime :: atZone']直接进入'ZonedDateTime'(https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#atZone-java.time.ZoneId - ),如'LocalDateTime.parse(inputTime,formatter).atZone(z)' –

+1

这不会给出相同的结果@BasilBourque。我得到了'2017-03-21 14:35:43',和输入一样。从UTC转换时,我们需要以某种方式告诉我们要从哪个偏移量转换而来。 –

+1

我收回我的建议。你的代码是正确的,因为它是。我误以为亚洲/利雅得是预期的区域。在重读这个问题时,我看到UTC是主要区域,而利雅得则是次要区域。 –

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; 
} 
+0

你错过了毫秒 –

+0

@ cricket_007似乎没有在OP的输入 – njzk2

+0

@ njzk2 hm? 2017-03-21 14:35:43 –