Java SimpleDataFormat时区解析
我在解析这个日期时遇到了困难,最后的+0导致了一个问题,有人知道我的格式字符串有什么问题吗??如果我从日期字符串中删除+0,从格式字符串中删除Z,那么效果很好,不幸的是,对于我的应用程序来说,这不是一个选项Java SimpleDataFormat时区解析,java,simpledateformat,Java,Simpledateformat,我在解析这个日期时遇到了困难,最后的+0导致了一个问题,有人知道我的格式字符串有什么问题吗??如果我从日期字符串中删除+0,从格式字符串中删除Z,那么效果很好,不幸的是,对于我的应用程序来说,这不是一个选项 public class Main { /** * @param args */ public static void main(String[] args) { SimpleDateFormat dateFormater = new S
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
SimpleDateFormat dateFormater = new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss zZ");
try {
Date d = dateFormater.parse("Sun, 04 Dec 2011 18:40:22 GMT+0");
System.out.println(d.toLocaleString());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
如果格式如此一致,则可以将
0:00
附加到日期字符串
String dateString = "Sun, 04 Dec 2011 18:40:22 GMT+0";
SimpleDateFormat sdf = new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss z", Locale.ENGLISH);
Date date = sdf.parse(dateString + "0:00");
System.out.println(date);
(请注意,我修复了
SimpleDateFormat
构造,以明确指定用于解析星期日和月份名称的区域设置,否则它可能会在不使用英语作为默认区域设置的平台上失败;我还想知道您是否不需要HH
而不是kk
,但除此之外)一种方法是使用普通的字符串操作技术将字符串从您期望的表单转换为SimpleDataFormat
能够理解的表单。您还没有明确说明可以接受的时区格式范围,但有一种可能是这样的:
private static Date parse(String dateString) throws ParseException
{
final SimpleDateFormat dateFormat =
new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss Z");
dateString = dateString.replaceAll("(GMT[+-])(\\d)$", "$1\\0$2");
dateString = dateString.replaceAll("(GMT[+-]\\d\\d)$", "$1:00");
return dateFormat.parse(dateString);
}
这将支持GMT加上或减去一个或两位数的小时偏移量,此外还支持任何已由SimpleDataFormat
支持的内容,例如EST
或GMT+1030
或者,如果您知道它将始终是GMT,那么您可以在格式化程序上设置时区,并忽略字符串中的时区:
private static Date parse(String dateString) throws ParseException
{
final SimpleDateFormat dateFormat =
new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
return dateFormat.parse(dateString);
}
您还可以分割差异。我注意到字符串中的时区格式与TimeZone.getTimeZone()
所期望的格式相匹配。这是故意的吗?如果是这样,您可以从字符串中提取时区格式,事先将其传递给dateFormat.setTimeZone
,然后在实际解析过程中忽略它:
private static Date parse(final String dateString) throws ParseException
{
final SimpleDateFormat dateFormat =
new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss");
if(dateString.indexOf("GMT") > 0)
dateFormat.setTimeZone
(
TimeZone.getTimeZone
(dateString.substring(dateString.indexOf("GMT")))
);
return dateFormat.parse(dateString);
}
在这里,他们创建了一个自定义的日期格式