首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中保存所有时区的日期时间

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

Stack Overflow用户
提问于 2016-04-16 15:06:45
回答 2查看 1.7K关注 0票数 2

我有一个应用程序,在这个应用程序中,用户可以创建问题,其他人可以用它查看日期时间(创建问题的时间)。现在我得到服务器日期时间,并将其保存在db中,但问题是,应用程序是由居住在一个有6-7个小时间隔的国家的人使用的。一个很小的例子是,我住在某个国家,我在晚上7点提出问题,但美国的时间是上午11点(只是猜测)。因此,用户可以立即检索问题,但是对于他来说,提问时间应该是上午11点,而不是晚上7点。所以,我怎样才能节省日期时间,这样所有时区都是一样的。我有点困惑,所以我需要一点帮助。我知道这与UTC的约会时间有关,但可以有人详细说明一下:)。谢谢你

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-16 15:32:54

将当前时间与1970年1月1日世界协调时午夜纪元之间的差值(以毫秒为单位)存储在数据库中。你可以通过打电话给System.currentTimeMillis()

一旦您有了它,您就可以在任何您想要的时区中提供时间,下面是一个简单的代码片段,它显示了我的计算机上可用的所有时区时间。

这段代码使用了内置在Java8及更高版本中的java.time框架。其中大部分功能还包括移植到Java 6和7敬Android

代码语言:javascript
复制
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的旧版本的等效版本:

代码语言:javascript
复制
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,您还必须将时区Id以伪标准格式GMT+/-mm:ss存储到数据库中。

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

代码语言:javascript
复制
int offsetFromUTC = tz.getOffset(time);

然后,您可以在毫秒内将这个增量转换为预期的时区id,可以这样做:

代码语言:javascript
复制
String timeZoneId = String.format(
    "GMT%+02d:%02d", offsetFromUTC / (60 * 60 * 1000), offsetFromUTC / (60 * 1000) % 60
);

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

代码语言:javascript
复制
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()));
票数 3
EN

Stack Overflow用户

发布于 2016-04-16 15:12:56

那么,我如何才能节省日期时间,以便所有时区都是相同的。

您应该使用UTC来存储您的日期,所以如果有人在+1时区使用您的应用程序,您需要首先将其转换为UTC。时区应仅用于向用户显示时间。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36665799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档