有没有可能在Java语言中使用SimpleDateFormat类来格式化日期时间,从而给出日期的时区部分而不在后面加上+0000。
编辑
我们正在更改Java中的默认时区,如下所示:
SimpleTimeZone tz = new SimpleTimeZone(0, "Out Timezone");
TimeZone.setDefault(tz);
不幸的是,我无法删除这段代码。我敢说整个系统都停止工作了。我认为最初的作者把这个放在了一些日光节约的问题上。
考虑到这一点,我想将日期格式设置为:
格林尼治标准时间2011-12-27 09:00
或
2011-12-27 09:00 BST
我只能将SimpleDateFormat输出为:
2011-12-27 09:00:00 GMT+00:00
它使用格式字符串yyyy-MM-dd HH:mm:ss z
我看不到任何地方的简单时区有任何引用冬季时间(GMT) id或夏季时间id (BST)。
发布于 2011-11-23 03:02:32
这根本不是一个优雅的解决方案,但它对我们来说是有效的。我必须为DateFormat/SimpleDateFormat创建一个自定义实现。这看起来如下所示:
static {
// this would be initialized like something as follows when the application starts
// which causes the headaches of SimpleDateFormat not to work...
SimpleTimeZone tz = new SimpleTimeZone(0, "Out Timezone");
TimeZone.setDefault(tz);
}
// therefore this class will workaround the issue,
public class OurOwnCustomDateFormat
extends SimpleDateFormat {
/** The pattern to use as the format string. */
protected String pattern;
public OurOwnCustomDateFormat(String pattern) {
super(pattern);
// store the pattern
this.pattern = pattern;
}
@Override
public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition pos) {
// custom implementation to format the date and time based on our TimeZone
toAppendTo.insert(pos.getBeginIndex(), "the date with our custom format calculated here");
return toAppendTo;
}
发布于 2016-03-09 15:32:44
这个问题和答案现在已经过时了。它们使用Java8和更高版本中内置的java.time框架过时的旧日期-时间类。旧的类设计很差,令人困惑,而且麻烦;避免使用。
避免3-4个字母的区域代码
避免使用3-4个字母的代码,如BST
。它们既不是标准化的,也不是唯一的。它们实际上并不代表时区。而且它们给夏令时(DST)的问题增加了更多的混乱。
相反,请使用proper time zones。大多数是Europe/London
之类的continent/region
格式。
避免设置默认时区
只有在最极端的情况下才应该调用java.util.TimeZone.setDefault
。此调用在运行时会立即影响JVM中所有应用程序的所有线程中运行的所有代码。
相反,在您的所有日期-时间代码中,请指定所需/预期的时区。如果省略,Java会通过隐式依赖于JVM的当前默认时区进行后退。如上所述,这个默认值可以在运行时的任何时刻改变!相反,应显式指定。如果您将所需/预期的时区指定为常规传递的参数,则当前的默认时区是没有意义的、不相关的。
java.time
java.time框架内置于Java8和更高版本中。参见Tutorial。由JSR 310定义。受到非常成功的Joda-Time库的启发。
Instant
Instant
是时间线上的时刻,以协调世界时为单位。
下面的示例展示了如果使用标准ISO 8601格式,java.time类如何在默认情况下解析/生成字符串,而不需要指定解析模式。使用DateTimeFormatter
类指定其他非标准模式。
Instant instant = Instant.parse( "2011-12-27T09:00:00Z" );
ZonedDateTime
根据需要应用时区,生成ZonedDateTime
。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );
生成字符串
您可以使用DateTimeFormatter
生成ZonedDateTime对象的文本表示形式。您可以指定自定义模式。或者,按照我的建议,让java.time为您本地化。
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM );
出于与时区…相同的原因,最好指定所需/预期的Locale
JVM的当前缺省值可以随时由JVM中运行的任何应用程序的任何线程中的任何代码更改。Locale
确定(a)用于命名日和月的人类语言,以及(b)文化规范,如逗号与句点,以及各部分的顺序,如月、日或年。
formatter = formatter.withLocale( Locale.CANADA_FRENCH );
String output = zdt.format( formatter );
关于java.time
框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.Date
、Calendar
和SimpleDateFormat
。
现在在maintenance mode中的项目建议迁移到java.time类。
要了解更多信息,请参阅。和搜索堆栈溢出,以获得许多示例和解释。规范为JSR 310。
您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC driver。不需要字符串,也不需要java.sql.*
类。
从哪里获取java.time类?
中的
项目使用额外的类扩展了java.time。这个项目是未来可能添加到java.time中的试验场。您可能会在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
和more。
发布于 2011-11-22 21:48:58
我认为您使用了正确的模式来满足您的需求,但是JDK不知道您的时区的名称,因此它切换到使用GMT offset value。
当我使用你的模式格式化日期时,我得到的时区部分是"GMT“。
TimeZone.getDefault().getDisplayName()
给了你什么?对我来说,我得到的是“格林威治标准时间”。
https://stackoverflow.com/questions/8227457
复制相似问题