StringWriter 的 toString 方法更改 TimeZone

Posted

技术标签:

【中文标题】StringWriter 的 toString 方法更改 TimeZone【英文标题】:toString Method of StringWriter changes TimeZone 【发布时间】:2018-05-07 06:33:45 【问题描述】:

我正在使用 Rome RSS 编写 RssFeed,在调用 StringWriter 的 toString 方法后,它会更改 TimeZone。 我希望有一个固定的时区和时间,独立于运行代码的机器。

在调用 toString 方法之前,日期如下所示:

Mon Nov 10 00:00:00 CET 2014

调用 toString 方法后如下所示:

Sun, 09 Nov 2014 23:00:00 GMT

当我直接设置语言环境时,它也不会改变任何东西

Locale.setDefault(new Locale("en", "CA"));
String rssFeedString = writer.toString();

如何防止这种行为? 我无法直接使用 DateFormater,因为它在 ROME RSS API 中。

SyndFeedOutput output = new SyndFeedOutput();
output.output(feed, writer);
Locale.setDefault(new Locale("de", "DE"));
String rssFeedString = writer.toString();
writer.close();

【问题讨论】:

你的问题很不清楚。除此之外,您还没有明确告诉我们您正在格式化什么。我的 猜测 是它是 java.util.Date,但这还不清楚。请提供minimal reproducible example。 错误,没有。 StringWriter 将字符累积到一个字符数组中,其toString() 方法将这些字符作为String 返回。它与时区没有任何关系。你的假设很荒谬。 github.com/rometools/rome/issues/188 这是解释的行为。 所以它与StringWriter本身无关。在应用程序启动时设置语言环境或使用系统属性怎么样? -Duser.language=de -Duser.country=DE -Duser.timezone=Europe/Berlin 在应用程序启动时由于某些原因无法启动,但我尝试了 Locale.setDefault(new Locale("de", "DE"));并没有改变任何东西。 【参考方案1】:

toString() 方法视为日期、时间和数字的信息。您不应该依赖输出,因为它可能依赖于语言环境(您已经发现了)。

我建议您使用 DateFormat 类来固定关于系统区域设置的日期格式

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
// optionally you can set your timezone
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(sdf.format(someDate));

【讨论】:

以上是关于StringWriter 的 toString 方法更改 TimeZone的主要内容,如果未能解决你的问题,请参考以下文章

不关闭 stringwriter 会导致泄漏吗?

使用 StringWriter 进行 XML 序列化

StringWriter类的使用

[二十]JavaIO之StringReader 与 StringWriter

使用 StringWriter、StringBuilder 和 XmlTextWriter 加载 XML 并将其写入字符串

JavaScript对象数组如何按指定属性和排序方