我下面的代码(简化以集中的问题)。这将打印使用时区信息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
切勿使用Calendar
。使用java.time类来代替。
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 ) ;
显然,你想要的电流偏移从-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,但没有具体说明。也许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
仅供参考,即RFC 1123 / RFC 822格式是一种可怕的格式。它假定英语。这是很难机器解析,并难以对人类阅读。但我明白,你可能需要它过时的旧协议。
只是知道,现代协议使用ISO 8601标准格式。便利地,这些格式在默认使用java.time解析/生成字符串时类。
该java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.Date
,Calendar
,和SimpleDateFormat
。
该乔达-时间的项目,现在在维护模式,建议迁移到java.time类。
要了解更多信息,请参阅甲骨文教程。和搜索堆栈溢出了很多例子和解释。规范是JSR 310。
你可调换java.time与您的数据库对象直接。使用JDBC驱动程序符合JDBC 4.2或更高版本。无需串,不需要java.sql.*
类。
从哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time。该项目是为将来可能增加的java.time试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句