Java的SimpleDateFormat的解释“Z”不同的不同的操作系统

Abhijeet Apsunde:

我下面的代码(简化以集中的问题)。这将打印使用时区信息SimpleDateFormat的模式。

你知道为什么z为区别对待不同的机器上?如果有一种方法告诉Java在所有计算机上均匀地处理它?

这个类中使用JavaMail的,并且是造成我们的电子邮件标题,包括时间,这是不符合RFC 2822

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class DateFormatTest {
    String PATTERN = "z";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(this.PATTERN);

    public static void main(final String[] args) {
        new DateFormatTest().printTimezone();
    }

    public void printTimezone() {
        System.out.println(this.simpleDateFormat.format(Calendar.getInstance().getTime()));
    }

}

输出:Windows / Mac的

PDT

输出:Linux操作系统(CentOS的Linux的释放1804年5月7日(核心))/ Ubuntu的18分之14

GMT-07:00
罗勒布尔克:

TL;博士

切勿使用Calendar使用java.time类来代替。

对于字符串RFC 1123 / RFC 822格式:

OffsetDateTime
.now( ZoneOffset.UTC )
.format( DateTimeFormatter.RFC_1123_DATE_TIME )

星期一,2018年9月24日下午11点45分21秒GMT

为了得到当前在特定的时区偏移,从-UTC:

ZoneId
.systemDefault()
.getRules()
.getOffset(
    Instant.now() 
)
.toString()

-07:00

避免 Calendar

您正在使用取代年前被可怕的旧日期,时间类java.time切勿使用这些传统类; 他们是一个可怕的不幸混乱。

您对特定问题Calendar的行为是没有实际意义,因为没有必要永远不会再使用这个类。即使旧的代码尚未更新到互操作时java.time,你可以很容易地通过添加到老班新方法的传统与现代类之间的转换。

ZonedDateTime zdt = myGregorianCalendar.toZonedDateTime() ;

…和…

GregorianCalendar gc = GregorianCalendar.from( zdt ) ; 

java.time

显然,你想要的电流偏移从-UTC为当前默认的时区。

获取当前默认时区,一个ZoneId

ZoneId z = ZoneId.systemDefault() ;  // Or specify ZoneId.of( "Pacific/Auckland" ) or so on.

索要规则在该时区。

ZoneRules rules = z.getRules() ;

获得在某一时刻的偏移,从-UTC在该区域的影响。我们将使用当前的时刻,一个Instant

Instant now = Instant.now() ;
ZoneOffset offset = rules.getOffset( now ) ;

生成表示偏移从-UTC文本。

String output = "At " + now + " in zone " + z + " the offset is " + offset;

在2018-09-24T23:38:44.192642Z在区美洲/洛杉矶偏移为-07:00

RFC 1123 / RFC 822

你提到的RFC,但没有具体说明。也许RFC822分之1123?

为格式化内置java.time

OffsetDateTime nowInUtc = OffsetDateTime.now( ZoneOffset.UTC ) ;
String output = nowInUtc.format( DateTimeFormatter.RFC_1123_DATE_TIME ) ;

星期一,2018年9月24日下午11点45分21秒GMT

ISO 8601

仅供参考,即RFC 1123 / RFC 822格式是一种可怕的格式。它假定英语。这是很难机器解析,并难以对人类阅读。但我明白,你可能需要它过时的旧协议。

只是知道,现代协议使用ISO 8601标准格式。便利地,这些格式在默认使用java.time解析/生成字符串时类。


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

乔达-时间的项目,现在在维护模式,建议迁移到java.time类。

要了解更多信息,请参阅甲骨文教程和搜索堆栈溢出了很多例子和解释。规范是JSR 310

你可调换java.time与您的数据库对象直接。使用JDBC驱动程序符合JDBC 4.2或更高版本。无需串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time。该项目是为将来可能增加的java.time试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

不同版本的操作系统?

不同操作系统上的Java命令行

python基于操作系统的不同斜杠

加密多个分区(不同的操作系统)

使GO构建适应不同的操作系统

不同操作系统中的c clock()

Java邮件在不同的操作系统上是否工作方式不同

Java / Hector cassandra-client在不同操作系统上的不同性能

不同的操作系统环境下的JUnit测试的不同预期

Virtualenv为不同的操作系统提供不同的版本

如何为不同的操作系统提供不同的资产

hash()在不同的操作系统上返回不同的值

在不同的操作系统上,导入模块的路径是否不同?

为什么Java GUI JFrame的大小在不同的操作系统上会有所不同?

在不同的语言操作系统中,类型的字段是否相同?

具有不同操作系统的Elasticsearch复制集群

在Docker容器中运行不同的Linux操作系统?

widgetSelected()和不同操作系统平台的行为

Firefox下载适用于不同的操作系统吗?

什么是OS内核?它与操作系统有何不同?

不同操作系统中CLOCKS_PER_SEC的行为

Kubernetes适用于不同操作系统的职位

如何为不同的操作系统覆盖appsettings.json?

Directory.GetFiles-不同的输出取决于操作系统

vimperator,如何根据操作系统设置不同的qmark?

Perl-不同操作系统上的目录管理

R bookdown:不同的输出取决于操作系统

不同操作系统上的 ModuleNotFoundError 本地包设置相同

取决于操作系统的不同日志位置