这个想法是构建一个事件(自定义类event),用户可以在其中以小时和分钟为单位编写他希望事件发生的时间,并从calendarView中选择日期。我得到他从视图中选择的日期和他希望事件开始的时间并把它们放入事件对象中。问题是,当我创建它时,它会将日期设置为GMT-3(我的默认值),但我希望日期是EST。由于应用程序将主要由使用EST格式的人使用,如果我创建事件,它将显示错误的,反之亦然,如果我想为这些事件设置通知,它们将不正确。有没有办法在EST中创建日期?
这样,如果他们用EST创建一个日期,我从我的手机上读取它,它会显示在我的时区,不是吗?
br
捕获输入。
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 )
) ;
使用合适的时区名称
指定合适的时区名称。永远不要使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
偏移量与时区
与UTC的偏移量是与UTC不同的小时、分钟和秒数,特定地区的人们在设置时钟时间时使用这些时间,即挂钟时间。
时区是一个偏移量加上一组处理异常的规则。
所以GMT-3
是而不是您的时区,它是您的偏移量。您的时区可能是America/Buenos_Aires
、Antarctica/Rothera
等。
由于时区提供了更多的信息和更多的特性,因此始终优先使用时区而不是仅仅使用偏移量。
提示:总是用填充零和以冒号分隔的小时和分钟来写偏移量。ISO 8601标准允许其他变体,但有时在各种协议或软件系统中不受支持。因此,请使用-03:00
而不是-3
。
避免遗留的日期时间类
不要使用与早期Java版本捆绑在一起的出了名的麻烦的旧遗留类。避免使用java.util.Date
、java.util.Calendar
、SimpleDateFormat
等。现在被爪哇取代了。时间类。
LocalDate
&LocalTime
h1> java中的LocalDate
和LocalTime
类型。Time表示仅限日期或仅限当天时间的值,不带时区。使用这些工具从小部件收集数据。" Local "的意思是" unzoned ",没有偏移量或时区的含义。
LocalDate ld = LocalDate.of( 2016 , 1 , 2 );
LocalTime lt = LocalTime.of( 12 , 34 , 56 );
OffsetDateTime
LocalDate ld = LocalDate.of( 2016 , 1 , 2 );
LocalTime lt = LocalTime.of( 12 , 34 , 56 );
OffsetDateTime
如果我们只有三个小时的时差,而不是一个完整的时区,解释那对LocalDate
&LocalTime
作为OffsetDateTime
对象和ZoneOffset
对象。
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时间轴上的时刻,分辨率为纳秒。
您可以从其他类型中提取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" ) );
这些对象都代表同一时刻,时间线上的同一点。它们的不同之处在于,我们是通过每个地方的挂钟时间的透镜来观察同一时刻。
<标题>字符串标题>请记住,字符串不是日期时间值;它们是日期-时间值的文本表示形式。
所以日期-时间对象可以生成您想要的任何格式的String。您可以指定自定义格式。但通常最好让java。时间自动定位。
要进行本地化,请指定:
-
FormatStyle
来确定字符串的长度或缩写。 -
Locale
确定(a)翻译日期、月份等的人类语言,以及(b)决定缩写、大写、标点等问题的文化规范。
的例子:
Locale l = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( l );
String output = zdt.format( f );
注意Locale
与时区正交,完全与无关。您可以使用法语表示Pacific/Auckland
分区值,也可以使用印度教表示Europe/Copenhagen
分区值。
java。时间框架内置于Java 8及以后版本中。这些类取代了麻烦的旧日期时间类,如java.util.Date
, .Calendar
, &java.text.SimpleDateFormat
。
Joda-Time项目,现在处于维护模式,建议迁移到java.time.
要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获得许多示例和解释。
大部分java。时间功能向后移植到Java 6;7在ThreeTen-Backport和进一步适应Android在ThreeTenABP(见如何使用…)。
three - ten - extra项目扩展了java。有额外课程的时间。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
等。