在java中保存所有时区的日期时间

时间:2016-04-16 15:06:45

标签: java android

我有一个应用程序,用户可以在其中创建问题而其他人可以 用它来查看日期时间(创建问题时)。现在我明白了 服务器日期时间并将其保存在数据库中,但问题是应用程序被使用 生活在一个有6-7小时差距的国家的人。 那么一个小例子就是我住在一些国家,我在晚上7点创建问题但在美国的时间是上午11点(只是一个猜测)。所以用户立即检索问题,但对他来说问题的时间应该是上午11点,而不是晚上7点。那么如何保存日期时间,以便所有时区都相同。我有点困惑 所以我需要一些帮助。我知道它与UTC日期时间有关但可以 有人详细说明了这一点:)。谢谢你

2 个答案:

答案 0 :(得分:3)

  

那么如何保存日期时间,以便所有时区都相同

您应该使用UTC来存储日期,因此如果有人在+1时区内使用您的应用,则需要先将其转换为UTC。时区只应用于向用户显示时间。

答案 1 :(得分:3)

将当前时间与1970年1月1日午夜的epoch之间的差异(以毫秒为单位)存储到数据库中。您可以致电System.currentTimeMillis()

有了它,您可以在任何Time Zone中提供所需的时间,这是一个简单的代码段,显示我机器上all the time zones的可用时间。

此代码使用Java 8及更高版本中内置的java.time框架。此功能大部分也是back-ported to Java 6 & 7to Android

long time = System.currentTimeMillis();
Instant instant = Instant.ofEpochMilli(time);
ZoneId.getAvailableZoneIds().stream().forEach(id -> {
        ZoneId zId = ZoneId.of(id);
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zId);
        System.out.printf(
            "The current time in %s is %s%n",  
            zId, localDateTime.format(DateTimeFormatter.ISO_DATE_TIME)
        );
    }
);

以下是旧版Java的等效项:

long time = System.currentTimeMillis();
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
for (String id : TimeZone.getAvailableIDs()) {
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
    formatter.setTimeZone(TimeZone.getTimeZone(id));
    System.out.printf(
        "The current time in %s is %s%n",  id, formatter.format(cal.getTime())
    );
}

响应更新:

由于您希望保留原始TimeZone,您还必须以伪标准格式GMT +/- mm:ss将时区ID存储到数据库中。

为此,首先需要获得与UTC时间相比的增量(在tz下面的代码片段中是我当前的TimeZone):

int offsetFromUTC = tz.getOffset(time);

然后,您可以将此增量(以毫秒为单位)转换为预期的时区ID,可以这样做:

String timeZoneId = String.format(
    "GMT%+02d:%02d", offsetFromUTC / (60 * 60 * 1000), offsetFromUTC / (60 * 1000) % 60
);

timeZoneId的值是您必须存储到数据库中的第二个值。使用这两个值,您可以以任何预期的格式显示时间,例如:

Calendar cal = Calendar.getInstance();
// Here I use the time retrieved from the DB
cal.setTimeInMillis(time);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
// Here I use the time zone id retrieved from the DB
TimeZone tz = TimeZone.getTimeZone(timeZoneId);
formatter.setTimeZone(tz);
System.out.printf("The current time in %s is %s%n",  id, formatter.format(cal.getTime()));