Java 用“时区”解析日期;Etc/GMT“;

Java 用“时区”解析日期;Etc/GMT“;,java,date,Java,Date,我的第一次尝试是: DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); Date date = formatter.parse(string); 它抛出了ParseException,所以我发现了这个hack: DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); TimeZone timeZone = TimeZone.

我的第一次尝试是:

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
Date date = formatter.parse(string);
它抛出了ParseException,所以我发现了这个hack:

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
TimeZone timeZone = TimeZone.getTimeZone("Etc/GMT");
formatter.setTimeZone(timeZone);
Date date = formatter.parse(string);
它也不起作用,现在我被卡住了。如果我把时区改成“GMT”,它的解析就没有问题了

编辑:要解析的示例字符串是“2011-11-29 10:40:24 Etc/GMT”

edit2:我不希望完全删除时区信息。我正在编写一个从外部用户接收日期的服务器,因此其他日期可能会有其他时区。
更准确地说:我收到的这个具体日期是在iphone应用程序上进行应用内购买后从苹果服务器收到的,但我也可以从其他来源收到日期。

以下代码对我有效

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("Etc/GMT")); try { System.out.println( sdf.parse("2011-09-02 10:26:35 Etc/GMT") ); } catch (ParseException e){ e.printStackTrace(); }
SimpleDataFormat sdf=新的SimpleDataFormat(“yyyy-MM-dd HH:MM:ss”); 设置时区(TimeZone.getTimeZone(“Etc/GMT”); 试试{System.out.println(sdf.parse(“2011-09-0210:26:35 Etc/GMT”); }捕获(异常解析){ e、 printStackTrace(); }
这对我也不起作用,因为我尝试将SimpleDataFormatter的时区设置为“Etc/GMT”,然后格式化了一个新的日期以下是输出:

2011-11-30 10:46:32格林尼治标准时间+00:00

所以Etc/GMT被翻译成GMT+00:00

如果您真的想坚持解析“2011-09-02 10:26:35 Etc/GMT”,那么以下内容也会有所帮助,而不必考虑明确的时区更改:

java.text.SimpleDateFormat isoFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss 'Etc/GMT'");
isoFormat.parse("2010-05-23 09:01:02 Etc/GMT");

工作正常。

不知道这个问题是否仍然与您相关,但如果您使用Joda时间,这将起作用:

DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss ZZZ").parseDateTime(s)
如果没有Joda时间,以下工作将起作用(尽管需要更多的工作):


该死,出于某种原因,我刚刚得到了“java.text.ParseException:不可解析的日期:”2011-09-02 10:26:35 Etc/GMT“。这怎么可能?我已经检查过getTimeZone()是否不返回null或类似的值。simpleDataFormat sdf=new simpleDataFormat(“yyy-MM-dd HH:MM:ss”);它可以从格式化程序中删除区域信息,将小的
z
移出。那就不考虑时区了。你的代码可以正常工作!我认为问题的关键不是要忽略时区,而是要考虑到它。如果字符串包含例如“America/Los_Angeles”时区,则代码将给出错误的结果。
String s = "2011-11-29 10:40:24 Etc/GMT";

// split the input in a date and a timezone part            
int lastSpaceIndex = s.lastIndexOf(' ');
String dateString = s.substring(0, lastSpaceIndex);
String timeZoneString = s.substring(lastSpaceIndex + 1);

// convert the timezone to an actual TimeZone object
// and feed that to the formatter
TimeZone zone = TimeZone.getTimeZone(timeZoneString);
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
formatter.setTimeZone(zone);

// parse the timezoneless part
Date date = formatter.parse(dateString);