简短总结
不要使用Calendar
,而应该使用java.time类。
对于RFC 1123 / RFC 822格式的字符串:
OffsetDateTime
.now( ZoneOffset.UTC )
.format( DateTimeFormatter.RFC_1123_DATE_TIME )
获取特定时区的当前UTC偏移量的方法是:
ZoneId
.systemDefault()
.getRules()
.getOffset(
Instant.now()
)
.toString()
避免使用
Calendar
您正在使用可怕的旧日期时间类,这些类早在多年前就被
java.time替代了。永远不要使用那些传统的类;它们是一个可怕的糟糕混乱。
您关于
Calendar
行为的特定问题已经没有意义了,因为再也没有必要再次使用该类。即使与尚未更新为
java.time的旧代码进行交互,您也可以通过添加到旧类中的新方法轻松转换传统和现代类之间的差异。
ZonedDateTime zdt = myGregorianCalendar.toZonedDateTime() ;
…and…
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年9月24日23:38:44.192642Z,偏移量为-07:00。
RFC 1123 / RFC 822
您提到了一个RFC但没有指定。也许是RFC 1123 / 822?
java.time内置了
该格式的格式化程序。
OffsetDateTime nowInUtc = OffsetDateTime.now( ZoneOffset.UTC ) ;
String output = nowInUtc.format( DateTimeFormatter.RFC_1123_DATE_TIME ) ;
2018年9月24日23:45:21 GMT
FYI,RFC 1123 / RFC 822格式很糟糕。它假定使用英语。对于机器来解析和人类来阅读都很困难。但我知道你可能需要它来处理过时的旧协议。
现代协议使用
ISO 8601标准格式。方便的是,在解析/生成字符串时,
java.time类默认使用这些格式。
关于java.time
java.time框架是内置于Java 8及更高版本中的。这些类取代了麻烦的旧legacy日期时间类,如java.util.Date
、Calendar
和SimpleDateFormat
。
Joda-Time项目现在处于maintenance mode,建议迁移到java.time类。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow上搜索许多示例和解释。规范为JSR 310。
您可以直接使用与JDBC 4.2或更高版本兼容的JDBC驱动程序,与数据库交换java.time对象。无需使用字符串,也不需要使用java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目通过额外的类扩展了java.time。该项目是java.time可能未来添加类的试验场。您可能会在这里找到一些有用的类,如
Interval
,
YearWeek
,
YearQuarter
和
more。
RFC 2822 - Internet Message Format - IETF Datatracker
可能是 RFC 822,其中大写字母Z
而不是小写字母z
。 - user85421java.util.Date
、java.util.Calendar
和java.text.SimpleDateFormat
这样的旧日期时间类现在已经成为遗留系统,被内置于Java 8及更高版本中的java.time类所取代。请参阅Oracle的教程。 - Basil Bourque