2016-09-14 78 views
0

这个想法是建立一个事件(自定义类别事件),用户可以在这里写下他想要事件在几小时和几分钟内的时间,并从日历视图中选择日期。 所以我得到他从视图中选择的日期以及他希望事件开始的时间,并将它们放入事件对象中。问题是,当我创建它时,它会将日期设置为GMT-3(我的默认),但我希望日期在EST中。由于该应用将主要由使用EST格式的用户使用,因此如果我创建了该事件,它将显示错误信息并反之亦然,如果我想为这些事件设置通知,则它们将不正确。 有没有办法在EST中创建日期?在美国东部时间设置日期 - Android

这样,如果他们在EST中创建了一个日期,并且我从手机中读取了它,它将显示在我的时区中吗?

+0

我只是推荐阅读:http://stackoverflow.com/questions/11537106/is-it-always-a-good-idea-to-store-time-in-utc-or-is-this-这种情况下,存储 –

回答

0

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字母缩写,如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

偏移与时区

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

LocalDateLocalTime类型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

要本地化,指定:

  • 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.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,等等。

+0

真正有用和详细的解释。出于某种原因,我无法将java.time fw导入到我的项目中,所以我不能在实践中使用它:( 我一直在使用从Calendar值解析的Date变量到目前为止。是否应该编辑事件所以它是用Instants来完成的? –

+0

@BrunoMorales重读关于Android和ThreeTenABP的倒数第二段,而且,我会在你的类中使用'Instant'对象,旧类真的很糟糕。您可能还想跟踪用户期望的/预期的偏移量或时区;取决于您的场景的细节。请记住分开基本数据的想法,通常应该使用UTC,而不是使用时区的演示文稿。 –

相关问题