我有一个应用程序,在这个应用程序中,用户可以创建问题,其他人可以用它查看日期时间(创建问题的时间)。现在我得到服务器日期时间,并将其保存在db中,但问题是,应用程序是由居住在一个有6-7个小时间隔的国家的人使用的。一个很小的例子是,我住在某个国家,我在晚上7点提出问题,但美国的时间是上午11点(只是猜测)。因此,用户可以立即检索问题,但是对于他来说,提问时间应该是上午11点,而不是晚上7点。所以,我怎样才能节省日期时间,这样所有时区都是一样的。我有点困惑,所以我需要一点帮助。我知道这与UTC的约会时间有关,但可以有人详细说明一下:)。谢谢你
发布于 2016-04-16 15:32:54
将当前时间与1970年1月1日世界协调时午夜纪元之间的差值(以毫秒为单位)存储在数据库中。你可以通过打电话给System.currentTimeMillis()。
一旦您有了它,您就可以在任何您想要的时区中提供时间,下面是一个简单的代码片段,它显示了我的计算机上可用的所有时区时间。
这段代码使用了内置在Java8及更高版本中的java.time框架。其中大部分功能还包括移植到Java 6和7和敬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,您还必须将时区Id以伪标准格式GMT+/-mm:ss存储到数据库中。
为此,首先需要获得与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()));发布于 2016-04-16 15:12:56
那么,我如何才能节省日期时间,以便所有时区都是相同的。
您应该使用UTC来存储您的日期,所以如果有人在+1时区使用您的应用程序,您需要首先将其转换为UTC。时区应仅用于向用户显示时间。
https://stackoverflow.com/questions/36665799
复制相似问题