我正在构建一个可以聊天的 android 应用程序。
在这个聊天中,我每条消息都有它的时间发送签名。
我的问题如下:
假设我国的时间是 X。我的朋友在国外,他的时间是 X 减去 7 小时。
我在16:00
当地时间给他发信息。
我想避免这样的情况,即他会收到09:00
签名将是的消息16:00
(如果你在他国家的那个朋友的眼中看,那是将来的时间)。
有没有办法在我的手机中将消息写成,16:00
而在他的手机中将写成09:00
?我有办法将时间转换为当地时间吗?
6 回答
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());
您应该使用 UTC 时间保持所有时间通信。然后根据设备当前时区设置对其进行本地化显示。
您将需要保存您的消息将保存的时区,并传输它(或发送 unix 纪元时间),然后在另一边确保您使用区域设置时间读取它(使用 Android 文档像http://developer.android.com/reference/java/util/Calendar.html可以提供帮助)。
使用 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。
避免 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”等术语。