如何将不同TimeZone的日期字符串转换为一个TimeZone中的date对象



我在做一个RSS阅读器软件。我获得带有pubDate(发布日期)值的项目作为字符串,将它们转换为date对象,并将它们放入我的DB。然而,当我检查我的数据库时,我看到了一些有趣的值,比如明天的日期。

我研究了这种情况,发现它是关于时区值z。例如,当我得到"Mon, 26 May 2014 21:24:29 -0500"时,它变成了"2014-05-27 05:24:29",第二天!

我想要的只是获取任意时区的日期,并将它们转换为通用时区的日期,例如我所在国家/地区的日期。

下面是我的代码:
 public static String convert(String datestr) throws ParseException {
    DateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
    Date date = formatter.parse(datestr);
    SimpleDateFormat resultFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    return  resultFormatter.format(date);
}

我使用的方法是这样的:

 System.out.println(convert("Mon, 26 May 2014 21:24:29 -0500"));

输出为:2014-05-27 05:24:29

由于您没有设置时区,所以它使用您系统的默认值。

设置指定的IANA时区。

SimpleDateFormat resultFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
resultFormatter.setTimeZone(TimeZone.getTimeZone("America/New_York"));
return resultFormatter.format(date);

看起来您传递了一个带时区的Date,但给出了错误的格式。如果你要传递像"-0500"这样的时区,你应该使用:

DateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");

请记住,系统将始终使用当前默认时区(timezone . getdefault())显示日期,除非您通过:

resultFormatter.setTimeZone(...)

正常工作。日期将根据您的系统时区进行转换。

检查系统的UTC偏移量,并将其替换为示例日期字符串,并查看输出


例如:印度是UTC+5:30

String datestr="Mon, 26 May 2014 21:24:29 +0530";
输出:

2014-05-26 21:24:29

替代解决方案

如果您不想考虑输入日期字符串的时区,那么只需截断该信息并从模式中删除zzz,如下面的代码所示:

String datestr = "Mon, 26 May 2014 21:24:29 -0530";
datestr = datestr.replaceAll("\s[-+](\d+)$", ""); // truncate the timezone info if not needed
DateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss"); // remove zzz from the pattern
Date date = formatter.parse(datestr);
SimpleDateFormat resultFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(resultFormatter.format(date));

相关内容

  • 没有找到相关文章

最新更新