1

我正在构建一个可以聊天的 android 应用程序。
在这个聊天中,我每条消息都有它的时间发送签名。
我的问题如下:
假设我国的时间是 X。我的朋友在国外,他的时间是 X 减去 7 小时。
我在16:00当地时间给他发信息。
我想避免这样的情况,即他会收到09:00签名将是的消息16:00(如果你在他国家的那个朋友的眼中看,那是将来的时间)。

有没有办法在我的手机中将消息写成,16:00而在他的手机中将写成09:00?我有办法将时间转换为当地时间吗?

4

6 回答 6

2

System.currentTimeMillis() 确实为您提供了自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数。Date 对象不保存您的本地时区。您可以使用 DateFormats 在任何时区将日期转换为字符串:

DateFormat df = DateFormat.getTimeInstance();
df.setTimeZone(TimeZone.getTimeZone("gmt"));
String gmtTime = df.format(new Date());

链接响应

于 2012-06-28T12:56:14.523 回答
1

您应该使用 UTC 时间保持所有时间通信。然后根据设备当前时区设置对其进行本地化显示。

于 2012-06-28T12:51:24.347 回答
0

您将需要保存您的消息将保存的时区,并传输它(或发送 unix 纪元时间),然后在另一边确保您使用区域设置时间读取它(使用 Android 文档像http://developer.android.com/reference/java/util/Calendar.html可以提供帮助)。

于 2012-06-28T12:51:32.137 回答
0

看看这里的答案:

https://stackoverflow.com/a/6094475/346232

您需要将时间更改为 UTC,然后在设备上转换为时区。

于 2012-06-28T12:54:41.657 回答
0

使用 long 将您的时间信息保存为自“纪元”(即 1970 年 1 月 1 日,格林威治标准时间 00:00:00)以来的毫秒数。可以使用该方法检索它,并且可以使用构造函数Date.getTime()轻松创建新的 Date 对象。Date(long millis)然后使用每个设备上的本地时区设置显示日期对象。

编辑:

纪元是一个定义的时间点,在不同的时区有不同的表达方式:1970-01-01 00:00:00 GMT但 1969-12-31 19:00:00 EST。时间戳只是从那时起经过的毫秒数。因此,例如时间戳1341169200对应于 2012-07-01 19:00:00 GMT和 2012-07-01 14:00:00 EST

于 2012-06-28T12:55:34.447 回答
0

避免 java.util.Date/.Calendar

与 Java(和 Android)捆绑在一起的 java.util.Date/.Calendar 类是出了名的麻烦,在设计和实现上都有缺陷。

乔达时间

Joda-Time图书馆是要走的路。这个库启发了现在内置在 Java 8 中的 java.time 包(在 Android 上不可用)。

世界标准时间

正如其他答案所建议的那样,最佳实践(通常)是将您的业务逻辑和数据存储/通信保持在UTC时区(有些人认为没有时区或“反”时区)。仅在用户或数据消费者期望时调整到特定时区。

时区

Joda-Time 中的DateTime类表示日期时间值以及分配的时区。

请注意,最好在所有操作中指定时区。否则,您将隐式依赖 JVM 当前的默认时区。这是有风险的,因为该区域可能会发生变化——即使在运行时任何时候,任何应用程序的任何线程中的任何代码都可以在您的应用程序的 JVM 中运行。并使用正确的时区名称,不要使用 3-4 字母代码。

示例代码

Joda-Time 2.7 中的示例代码。

DateTime sent = DateTime.now( DateTimeZone.getDefault() ) ;
DateTime sentUtc = nowMine.withZone( DateTimeZone.UTC ) ; // Generally, use this for your work, including communicating to other threads and apps and such.

当准备好向其他用户显示时,调整到预期的时区。

DateTimeZone zone = DateTimeZone.forID( "America/Montreal" ) ;  // Or DateTimeZone.getDefault() if you want to rely on their JVM’s current default. To be absolutely sure of expected time zone, you really must ask the user.
DateTime sentMontréal = sentUtc.withZone( zone );

要生成这些日期时间对象的文本表示,请在 StackOverflow.com 上搜索有关该主题的许多问题和答案。搜索“joda”、“DateTimeFormatter”和“DateTimeFormat”等术语。

于 2015-05-27T04:00:05.060 回答