【问题标题】:android java time安卓java时间
【发布时间】:2012-06-29 23:54:21
【问题描述】:

我正在构建一个具有聊天功能的 Android 应用程序。
在这个聊天中,我每条消息都有它的时间发送签名。
我的问题如下:
假设我国的时间是 X。我的朋友在国外,他的时间是 X 减去 7 小时。
我正在给他发消息16:00当地时间。
我想避免他将在09:00 收到签名为16:00 的消息的情况(如果您在他的国家/地区看着那个朋友的眼睛,这是将来的时间)。

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

【问题讨论】:

  • 嗨。 Asaf,您实际上可以显示当地时间,即当您在手机上阅读时,它会分配您的当地时间,当您在手机上发送它时,它将被转换为当地时间,您可能提到您可以手动转换和随时间发送消息

标签: java android datetime


【解决方案1】:

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

【讨论】:

  • 我必须说我不太明白该怎么做。举个例子,我的时间以毫秒为单位,因为“eposch”是 12345,即 21:00 01/01/2000 以色列当地时间。我要寄长线到美国——也就是说,可以说是负 7 小时。那么美国如何从 12345 显示 14:00 01/01/2000?
  • @AsafNevo This article 解释了如何在 java 中进行时区转换。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    看看这里的答案:

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

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

    【讨论】:

      【解决方案4】:

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

      编辑:

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

      【讨论】:

      • 所以如果我的 long 是 12345 并且是 21:00,我将在另一个国家/地区显示它,它可以显示 14:00 相同的 long ??
      • 没错!它在 Android 中通常以这种方式使用,例如在应用内计费协议中。
      • 不需要以某种方式将其转换为哪个国家/地区?
      • 只是时间信息如何呈现的问题。 Date.toString() 使用 TimeZone.getDefault() 来生成它的日期字符串。如果您想明确表示另一个时区的时间,请使用 DateFormat 对象。
      • 但是发送消息的时区比本地时间大吗?它怎么知道 1234 等于以色列的 21:00 和美国的 14:00?在美国看来,1234 时间是未来,它只会在 7 小时内累积。它不是必须以某种方式获取基准时间作为参数吗?
      【解决方案5】:

      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());
      

      linked response

      【讨论】:

        【解决方案6】:

        避免使用 java.util.Date/.Calendar

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

        乔达时间

        Joda-Time 库是必经之路。这个库启发了现在内置于 Java 8 中的 java.time 包(在 Android 上不可用)。

        UTC

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

        时区

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

        请注意,最好在所有操作中指定时区。否则,您将隐式依赖 JVM 当前的默认时区。这是有风险的,因为该区域可能会发生变化——即使在运行时,任何应用程序的任何线程中的任何代码在任何时候都可以在你的应用程序的 JVM 中运行。并使用proper time zone names,不要使用 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”等术语。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-14
          • 1970-01-01
          • 1970-01-01
          • 2023-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多