tl; dr
捕获输入。
Instant instant =
OffsetDateTime.of(LocalDate.of(2016 , 1 , 2) ,
LocalTime.of(12 , 34 , 56) ,
ZoneOffset.ofHours(-3)
)
.toInstant() ;
产生任何Locale
任何时区的显示输出。
String output =
instant.atZone(ZoneId.of("Pacific/Auckland"))
.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL)
.withLocale(Locale.CANADA_FRENCH)
) ;
使用适当的时区名称
指定proper time zone name。切勿使用3-4字母缩写,如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
偏移与时区
的offset-from-UTC是几个小时和分钟,从UTC不同秒的人一个特定地区在制定自己的时钟,则wall-clock time时使用。
时区是偏移量加一组处理异常的规则。
所以GMT-3
是不是您的时区,它是你的抵消。您的时区可能是America/Buenos_Aires
,Antarctica/Rothera
或其他。
由于时区提供了更多信息和更多功能,因此请始终在单纯的偏移量上优先使用时区。
提示:始终写出一个与填零和与两个小时和分钟由冒号分开抵消。 ISO 8601标准允许其他变体,但有时不支持各种协议或软件系统。因此,请使用-03:00
而不是-3
。
避免遗留日期时类
不要使用与Java的早期版本中捆绑了名的麻烦旧的遗留类。避免java.util.Date
,java.util.Calendar
,SimpleDateFormat
等等。现在由java.time类取代。
LocalDate
& LocalTime
的LocalDate
和LocalTime
类型java.time表示日期只或值天仅分时,没有时区。使用这些来从你的小部件收集数据。 “本地”是指“未分区”,缺乏偏移或时区意义。
LocalDate ld = LocalDate.of(2016 , 1 , 2);
LocalTime lt = LocalTime.of(12 , 34 , 56);
OffsetDateTime
如果我们只有三小时,而不是一个完整的时区偏移,解释说对LocalDate
& LocalTime
作为一个ZoneOffset
对象OffsetDateTime
对象。
ZoneOffset offset = ZoneOffset.ofHours(-3);
OffsetDateTime odt = OffsetDateTime.of(ld , lt , offset);
ZonedDateTime
如果我们心中有一个时区,应用ZoneId
得到ZonedDateTime
。
ZoneId z = ZoneId.of("America/Buenos_Aires");
ZonedDateTime zdt = ZonedDateTime.of(ld , lt , z);
Instant
做很多你的业务逻辑,数据存储,以及UTC的数据交换。只在需要的地方应用偏移或时区,例如向用户演示。
Instant
类表示UTC中时间轴上的一个时刻,分辨率为nanoseconds。
您可以从其他类型中提取Instant
对象。
Instant instant = zdt.toInstant();
将瞬间调整为您可能需要的任何其他时区。
ZonedDateTime zdtNewYork = instant.atZone(ZoneId.of("America/New_York"));
ZonedDateTime zdtParis = instant.atZone(ZoneId.of("Europe/Paris"));
ZonedDateTime zdtAuckland = instant.atZone(ZoneId.of("Pacific/Auckland"));
这些对象都表示同一时刻,即时间轴上的相同点。它们的不同之处在于,我们通过每个地区的镜头wall-clock time查看同一时刻。
字符串
请记住,字符串不是日期时间值;它们是表示的日期时间值的文本。
因此,一个日期时间对象可以生成你想要的任何格式的字符串。您可以指定一个自定义格式。但通常最好让java.time自动为您提供localize。
要本地化,指定:
实施例:
Locale l = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withLocale(l);
String output = zdt.format(f);
注意Locale
正交于时区,完全无关。您可以使用法语介绍Pacific/Auckland
区域值或印度介绍区域值Europe/Copenhagen
。
关于java.time
的java.time框架是建立在Java 8和更高版本。这些课程取代了麻烦的旧日期时间课程,如java.util.Date
,.Calendar
,& java.text.SimpleDateFormat
。
Joda-Time项目现在位于maintenance mode,建议迁移到java.time。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。
大部分的java.time功能后移植到Java 6 和ThreeTenABP还适于Android(见How to use…)。
ThreeTen-Extra项目扩展java.time与其他类。这个项目是未来可能增加java.time的一个试验场。你可以在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
,等等。
我只是推荐阅读:http://stackoverflow.com/questions/11537106/is-it-always-a-good-idea-to-store-time-in-utc-or-is-this-这种情况下,存储 –