有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java应用中的安卓无关时间

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

什么是最好的方法

今天我使用:

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

但这对我来说不是个好办法,因为它不是线程安全的

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


共 (3) 个答案

  1. # 1 楼答案

    我只想使用GMT以毫秒为单位计算时间(顺便说一句,计算机本身不支持UTC)

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

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

    顺便说一句,日历是相当慢,即使在个人电脑上。我会避免在手机上使用它

  2. # 2 楼答案

    Time is downloaded from server in milliseconds format- it should be independent from locale and other system preferences

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

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

    Program have to contain own internal clock fetching time from external server

    这毫无意义

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

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

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

  3. # 3 楼答案

    aJava application使用的时间(以毫秒为单位)为

    the specified number of milliseconds since the standard base time known as "the epoch", namely January 1, 1970, 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对象。然后使用格式化类以所需的格式、区域设置、时区打印时间