我想在申请中设定任意的时间。时间以毫秒格式从服务器下载-它应该独立于locale和其他系统首选项。但是应用程序重新获得了线程安全解决方案,并且像标准的非线程安全的Calendar对象一样。
什么是最好的方法?
今天我用:
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
calendar.setTimeInMillis(serverTime);但对我来说不是个好办法,因为线程不安全。
tl;dr程序必须包含自己从外部服务器获取内部时钟的时间。时钟必须是线程安全的。
发布于 2013-09-08 21:04:39
Java应用程序使用的时间(毫秒)是
自称为“时代”的标准基准时间以来的指定毫秒数,即1970年1月1日:00:00格林尼治标准时间。
这个数字是基于格林尼治时间区域。如果您需要在另一个时区打印它,可以使用任何您想要的格式化类,比如SimpleDateFormat。如果需要使保持线程安全的变量安全,只需对其进行同步,可能会将其包装在类中。
public class TimeInMillis {
private volatile long time;
public void setTime(long time) {this.time = time;}
public time getTime() {return time;}
}每当您需要显示它时,只需获取TimeInMillis对象、获取time并使用它创建Calendar对象。然后使用格式化类以所需的格式、区域设置和时区打印时间。
发布于 2013-09-08 21:24:36
时间以毫秒格式从服务器下载??它应该独立于地区设置和其他系统首选项。
那不是“时间”。这是一个时间戳,意指特定软件在特定时间点报告的特定时间值。
现在,如果您想说,在将来与此服务器的通信中,您希望将设备报告的时间转换为服务器已知的时间基,这至少有点道理。在这种情况下,您可以计算接收时间戳时设备时间与时间戳本身中的时间值之间的增量。然后,将该增量应用于将来向服务器报告的时间。
程序必须包含自己从外部服务器获取内部时钟的时间。
这完全没有道理。
在这个宇宙中,根据我们目前的物理学知识,时间是连续的和线性的。时间不只是在“从外部服务器获取时间”时才会改变。同样,“从外部服务器获取.”的是时间戳,是服务器上的时钟在发出请求时认为时间是什么的声明。您可以使用该时间戳与来自该服务器的其他时间戳进行比较,还可以使用该时间戳与设备的当前时间进行比较,以确定差异。
但是,您不能用Java代码创建硬件,因此不能用Java代码创建“内部时钟”。唯一的时钟是设备的时钟。如前所述,您可以通过应用上述差异将设备的时钟时间转换为服务器的时间基,但时间的流逝仍由设备自己的时钟标记。
由于差异将是int或long,所以如果您关注多个线程同时处理该值,则可以使用AtomicInteger或AtomicLong。
发布于 2013-09-08 20:57:12
我只想在千禧年与格林尼治时间(BTW计算机不支持UTC本身)。
long serverTime = System.currentTimeMillis(); // millis since 1/1/1970 GMT.要以线程安全的方式获取/设置它,可以将其设置为volatile。
顺便说一句,即使在个人电脑上,日历也很慢。我会避免在手机上使用它。
https://stackoverflow.com/questions/18688561
复制相似问题