我有一个将时间转换为其他时区的工作示例,但没有阿拉伯
试过很多方法,但总是得到“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";
}
}
答案 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()));
来查找。
尽管如此,如果可以的话,你可以跳过旧的SimpleDateFormat
,TimeZone
,Date
和DateFormat
来帮助自己。 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
,这是不好的做法,会让你不知道出了什么问题。