java应用程序中的独立时间

时间:2013-09-08 20:54:19

标签: java android multithreading time jodatime

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

什么是最好的方式?

今天我用:

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

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

TL;博士 程序必须包含来自外部服务器的内部时钟提取时间。时钟必须是线程安全的。

3 个答案:

答案 0 :(得分: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对象。然后使用格式化类以您需要的格式,区域设置,时区打印时间。

答案 1 :(得分:0)

  

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

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

现在,如果您试图说明,在将来与此服务器通信时,您希望将设备报告的时间转换为服务器已知的时基,至少有点意义。在这种情况下,您计算接收时间戳的设备时间与时间戳本身的时间值之间的差值。然后,将该delta应用于您向服务器报告的未来时间。

  

程序必须包含来自外部服务器的内部时钟提取时间

这没有任何意义。

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

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

由于差异将是intlong,如果您担心多个线程一次使用该值,则可以使用AtomicIntegerAtomicLong

答案 2 :(得分:-1)

我只想用GMT计算毫秒时间(BTW计算机不支持UTC)

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

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

即使在PC上,BTW日历也相当慢。我会避免在手机上使用它。