首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于自定义时区的不带Java时区偏移(GMT+00:00)的SimpleDateFormat

用于自定义时区的不带Java时区偏移(GMT+00:00)的SimpleDateFormat
EN

Stack Overflow用户
提问于 2011-11-22 21:19:14
回答 5查看 45.2K关注 0票数 14

有没有可能在Java语言中使用SimpleDateFormat类来格式化日期时间,从而给出日期的时区部分而不在后面加上+0000。

编辑

我们正在更改Java中的默认时区,如下所示:

代码语言:javascript
复制
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)。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-23 03:02:32

这根本不是一个优雅的解决方案,但它对我们来说是有效的。我必须为DateFormat/SimpleDateFormat创建一个自定义实现。这看起来如下所示:

代码语言:javascript
复制
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; 
    }
票数 3
EN

Stack Overflow用户

发布于 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类指定其他非标准模式。

代码语言:javascript
复制
Instant instant = Instant.parse( "2011-12-27T09:00:00Z" );

ZonedDateTime

根据需要应用时区,生成ZonedDateTime

代码语言:javascript
复制
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );

生成字符串

您可以使用DateTimeFormatter生成ZonedDateTime对象的文本表示形式。您可以指定自定义模式。或者,按照我的建议,让java.time为您本地化。

代码语言:javascript
复制
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM );

出于与时区…相同的原因,最好指定所需/预期的LocaleJVM的当前缺省值可以随时由JVM中运行的任何应用程序的任何线程中的任何代码更改。Locale确定(a)用于命名日和月的人类语言,以及(b)文化规范,如逗号与句点,以及各部分的顺序,如月、日或年。

代码语言:javascript
复制
formatter = formatter.withLocale( Locale.CANADA_FRENCH );
String output = zdt.format( formatter );

关于java.time

框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.DateCalendarSimpleDateFormat

现在在maintenance mode中的项目建议迁移到java.time类。

要了解更多信息,请参阅。和搜索堆栈溢出,以获得许多示例和解释。规范为JSR 310

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC driver。不需要字符串,也不需要java.sql.*类。

从哪里获取java.time类?

  • ,、、和更高版本-标准Java API的一部分,具有捆绑的实现。
    • Java9添加了一些次要功能和fixes.

  • 和.

中的

  • 大多数java.time功能已向后移植到Java6和7

    • 更高版本的Android捆绑实现的java.time类。
    • 对于较早的Android (<26),项目适配 (如上所述)。请参阅.

项目使用额外的类扩展了java.time。这个项目是未来可能添加到java.time中的试验场。您可能会在这里找到一些有用的类,如IntervalYearWeekYearQuartermore

票数 7
EN

Stack Overflow用户

发布于 2011-11-22 21:48:58

我认为您使用了正确的模式来满足您的需求,但是JDK不知道您的时区的名称,因此它切换到使用GMT offset value

当我使用你的模式格式化日期时,我得到的时区部分是"GMT“。

TimeZone.getDefault().getDisplayName()给了你什么?对我来说,我得到的是“格林威治标准时间”。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8227457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档