【问题标题】:Independent time in java applicationjava应用程序中的独立时间
【发布时间】:2013-09-08 20:54:18
【问题描述】:

我想在应用程序中设置任意时间。时间以毫秒格式从服务器下载——它应该独立于locale 和其他系统首选项。 但是应用程序重新获取线程安全解决方案,并且对象像标准而不是线程安全Calendar 对象。

什么是最好的方法?

今天我用:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
calendar.setTimeInMillis(serverTime);

但对我来说不是好方法,因为它不是线程安全的。

tl;博士 程序必须包含自己的内部时钟,从外部服务器获取时间。时钟必须是线程安全的。

【问题讨论】:

  • 但这对我来说还不够。你还缺少什么?
  • 不太确定您在问什么,但 currentTimeMillis() 不依赖于语言环境/时区,因此可以使用它。
  • 如果您需要日历的线程安全替代方案,请使用Joda Time。参考:Link.
  • @user2558882 是的,但您可能会提供示例代码

标签: java android multithreading time jodatime


【解决方案1】:

Java application 使用的时间以毫秒为单位

自标准基准时间以来的指定毫秒数 被称为“时代”,即 1970 年 1 月 1 日 00:00:00 GMT。

此数字基于 GMT 时区。如果您需要在另一个时区打印它,您可以使用任何您想要的格式化类,比如SimpleDateFormat。如果您需要使保存它的变量成为线程安全的,只需对其进行同步,可能通过将其包装在一个类中。

public class TimeInMillis {
    private volatile long time;

    public void setTime(long time) {this.time = time;} 

    public time getTime() {return time;}
}

当你需要显示它时,只需获取TimeInMillis 对象,获取time 并用它创建一个Calendar 对象。然后使用格式化类以您需要的格式、区域设置、时区打印时间。

【讨论】:

  • 你觉得使用类似JodaTime class DateTimeUtils 的东西怎么样?
  • 不需要synchronized
  • +1 这回答了如何以线程安全的方式存储时间的问题。您如何下载它以及如何显示它是不同的问题,应该与这个恕我直言混淆。顺便说一句,您可以将其设为 public enum TimeInMillis { INSTANCE; // etc. 之类的枚举
【解决方案2】:

时间以毫秒格式从服务器下载-它应该独立于语言环境和其他系统偏好

那不是“时间”。这是一个时间戳,表示特定软件在特定时间点报告的特定时间值。

现在,如果您想说的是,在未来与此服务器的通信中,您希望将设备报告的时间转换为服务器已知的时基,至少可以有点意思。在这种情况下,您将计算收到时间戳时的设备时间与时间戳本身中的时间值之间的差值。然后,将该增量应用于您向服务器报告的未来时间。

程序必须包含自己的内部时钟,从外部服务器获取时间

这毫无意义。

在这个宇宙中,根据我们目前的物理学知识,时间是连续的和线性的。只有当您“从外部服务器获取时间”时,时间才不会改变。同样,您“从外部服务器获取...”是时间戳,是服务器上的时钟认为您发出请求时的时间的声明。您可以将该时间戳用于与该服务器中的其他时间戳进行比较,并且您可以使用该时间戳与设备的当前时间进行比较以确定差异。

但是,您无法在 Java 代码中创建硬件,因此您无法在 Java 代码中创建“内部时钟”。唯一的时钟是设备的时钟。如前所述,您可以通过应用上述差异将设备时钟的时间转换到服务器的时基,但时间的流逝仍由设备自己的时钟标记。

由于区别在于intlong,如果您担心多个线程同时使用该值,可以使用AtomicIntegerAtomicLong

【讨论】:

    【解决方案3】:

    我只需要 GMT 的毫秒时间(顺便说一句,计算机不支持 UTC)

    long serverTime = System.currentTimeMillis(); // millis since 1/1/1970 GMT.
    

    要以线程安全的方式获取/设置它,您可以将其设为volatile

    BTW Calender 即使在 PC 上也很慢。我会避免在手机上使用它。

    【讨论】:

    • 对不起,应用程序必须从服务器下载时间。
    • 这可以解析为以毫秒为单位的 GMT 时间。
    • 我在想currentTimeMillis() - serverTime
    • @user902691 是如何下载时间的问题,还是如何以线程安全的方式存储/使用时间?
    • @KEYSER 你根本不懂我,应用程序应该有自己的时间与外部时钟同步。类似于 NTP。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多