java/android和夏令时中的处理日期/时间

java/android和夏令时中的处理日期/时间,java,android,date,datetime,Java,Android,Date,Datetime,我正在为Android做一个日记应用程序,我想让用户选择他们所在的时区。时间在程序上一直是我困惑的一个领域 我将为可用时区创建一个枚举 我将以longUTC格式将日期/时间条目保存到sqlite,然后以Java编程方式处理偏移量和DST,以便显示 事实上,我知道Java在日期/时间处理方面的局限性 Calendar utc = Calendar.getInstance(TimeZone.getTimeZone("UTC")); //returns the current time in UTC

我正在为Android做一个日记应用程序,我想让用户选择他们所在的时区。时间在程序上一直是我困惑的一个领域

我将为可用时区创建一个枚举

我将以
long
UTC格式将日期/时间条目保存到sqlite,然后以Java编程方式处理偏移量和DST,以便显示

事实上,我知道Java在日期/时间处理方面的局限性

Calendar utc = Calendar.getInstance(TimeZone.getTimeZone("UTC")); //returns the current time in UTC format
Long utcLong = utc.getTimeInMillis(); //returns current utc time in long for database insertion
问题1:我将如何对其应用偏移,并说明何时应用任何其他DST偏移?因为并非所有时区都遵守DST,DST在不同时区的不同日期生效


问题2:Java的
TimeZone
类有大约800个ID,用户需要滚动大约800个选项才能找到适用于他们的选项,这会很烦人。有短名单吗?我认为大约有50个有用的时区。

首先,我建议您不要使用
日历类。它过时了,已经过时了。这个糟糕的API被更好的API所取代:

  • 对于Java>=8,请使用

  • 对于Java,我一直在寻找joda时代似乎是一个流行的选择。你用过吗?你认为Three Ten更好吗?Jodatime很好,但它正在被新的API取代。Threeten更好,因为它是新Java8API的后端口(因此未来的迁移将比使用jodatime更容易)。即使在joda的网站上,它也指出joda Time被认为是一个基本上已经“完成”的项目。没有计划进行重大改进。如果使用JavaSE8,请迁移到Java.time(JSR-310)。如果您使用java,我还添加了更多的链接,希望对您有所帮助。@psycotik java.time框架是Joda time的正式继承者。这两个项目都是由同一个人Stephen Colebourne领导的。早期的Android可能不再需要后端端口。Gradle Plugin 4为API desugaring提供了将java.time功能的子集带到所有版本的Android上的功能。请注意,这里的代码示例不起作用。它返回本地时间,只更改时区信息,而不调整时间。
    // current date/time in UTC - now() always returns the current instant in UTC
    Instant instant = Instant.now();
    System.out.println(instant); // 2017-06-03T18:03:55.976Z
    
    // equivalent to calendar.getTimeInMillis(), it returns a long
    System.out.println(instant.toEpochMilli()); // 1496513035976
    
    // ZoneId accepts the same IDs used by TimeZone
    ZoneId zone = ZoneId.of("America/Sao_Paulo");
    // convert instant to timezone
    ZonedDateTime z = instant.atZone(zone);
    System.out.println(z); // 2017-06-03T15:03:55.976-03:00[America/Sao_Paulo]
    
    // converts back to UTC (returns an Instant)
    System.out.println(z.toInstant()); // 2017-06-03T18:03:55.976Z