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

时间:2014-05-27 21:01:26

标签: java date timezone

我正在研究RSS阅读器软件。我将pubDate(发布日期)值作为字符串获取,将它们转换为Date对象,并将它们放入我的数据库。但是,当我检查我的数据库时,我看到了一些有趣的值,例如明天的日期。

我研究这种情况并发现它是关于时区值Z.例如当我得到“星期一,2014年5月26日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

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

由于您尚未设置时区,因此它使用的是您系统的默认值。

设置特定的IANA time zone

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

答案 1 :(得分:0)

这是按预期工作的。日期根据系统的时区进行转换。

检查系统的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));

答案 2 :(得分:0)

看起来您通过了带有时区的日期,但格式错误。如果你传递时区如“-0500”,你应该使用:

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

请记住,系统将始终使用当前的默认时区(TimeZone.getDefault())显示日期,除非您通过以下方式覆盖它:

resultFormatter.setTimeZone(...)