java应用中的独立时间
我想在应用程序中设置任意时间。时间以毫秒格式从服务器下载-它应该独立于java应用中的独立时间,java,android,multithreading,time,jodatime,Java,Android,Multithreading,Time,Jodatime,我想在应用程序中设置任意时间。时间以毫秒格式从服务器下载-它应该独立于locale和其他系统首选项。 但应用程序需要重新获得线程安全解决方案,像标准这样的对象不是线程安全Calendarobject 什么是最好的方法 今天我使用: Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); calendar.setTimeInMillis(serverTime); 但这对我来说不是个好办法,因为它不是线程安全的
locale
和其他系统首选项。
但应用程序需要重新获得线程安全解决方案,像标准这样的对象不是线程安全Calendar
object
什么是最好的方法
今天我使用:
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
calendar.setTimeInMillis(serverTime);
但这对我来说不是个好办法,因为它不是线程安全的
tl;dr
程序必须包含从外部服务器获取时间的内部时钟。时钟必须是线程安全的。我只希望使用GMT以毫秒为单位计算时间(顺便说一句,计算机本身不支持UTC) 要以线程安全的方式获取/设置它,可以将其设置为volatile
顺便说一句,日历即使在PC上也非常慢。我会避免在手机上使用它。日历使用的时间(毫秒)是 自标准基准时间起的指定毫秒数 被称为“大纪元”,即1970年1月1日格林威治标准时间00:00:00 该数字基于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
对象。然后使用格式化类以所需的格式、区域设置、时区打印时间
时间以毫秒格式从服务器下载-它应该独立于区域设置和其他系统首选项
这不是“时间”。这是一个时间戳,表示特定软件在特定时间点报告的特定时间值
现在,如果您想说,在未来与该服务器的通信中,您希望将设备报告的时间转换为服务器已知的时基,这至少有点道理。在这种情况下,计算接收时间戳时的设备时间与时间戳本身中的时间值之间的增量。然后,将该增量应用于将来向服务器报告的时间
程序必须包含从外部服务器获取时间的内部时钟
这毫无意义
在这个宇宙中,根据我们目前的物理学知识,时间是连续的和线性的。只有在“从外部服务器获取时间”时,时间才会改变。同样,您正在“从外部服务器获取”的是一个时间戳,一个服务器上的时钟认为您发出请求时的时间是什么的语句。您可以使用该时间戳与来自该服务器的其他时间戳进行比较,并且可以使用该时间戳与设备的当前时间进行比较以确定差异
然而,您不能在Java代码中创建硬件,因此您不能在Java代码中创建“内部时钟”。唯一的时钟是设备的时钟。如前所述,您可以通过应用上述差异将设备的时钟时间转换为服务器的时基,但时间的流逝仍由设备自己的时钟标记
由于差异将是一个
int
或long
,如果您担心多个线程同时处理该值,则可以使用AtomicInteger
或AtomicLong
。但对我来说还不够。您缺少什么?不确定您要问什么,但currentTimeMillis()
不依赖于区域设置/时区,因此可能会使用它。如果您需要日历的线程安全替代方案,请使用。参考:。@user2558882是的,但您可能会提供示例代码抱歉,应用程序必须从服务器下载时间。这可以解析为以毫秒为单位的GMT时间。我想currentTimeMillis()-serverTime
@user902691是如何下载时间的问题,或者是如何以线程安全的方式存储/使用时间?@KEYSER您根本不理解我的意思,应用程序应该有自己的时间与外部时钟同步。与NTP类似。您认为如何使用类似于JodaTime
classDateTimeUtils
?不需要synchronized
。+1这回答了如何以线程安全的方式存储时间的问题。如何下载和如何显示是不同的问题,应该与此IMHO混淆。顺便说一句,您可以将其设置为类似于public enum TimeInMillis{INSTANCE;//等的枚举。
public class TimeInMillis {
private volatile long time;
public void setTime(long time) {this.time = time;}
public time getTime() {return time;}
}