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的主要内容,如果未能解决你的问题,请参考以下文章
[二十]JavaIO之StringReader 与 StringWriter
使用 StringWriter、StringBuilder 和 XmlTextWriter 加载 XML 并将其写入字符串