java的System.currentTimeMillis()和System.nanoTime()有什么区别
System.currentTimeMillis();
产生一个自1970年1月1日0时起到当前的毫秒。
DK1.5之后java中的计时给出了更精确的方法:System.nanoTime(),输出的精度是纳秒级别
System.currentTime(),这个方法,它的精度是毫秒,返回值是从1970.1.1的零点开始到当前时间的毫秒数,理论上这个可以用来算当前的时间,而且可以用这个值来构造一个Date对象。但是System.nanoTime()却是不同,代码注释上有这么一句: The value returned represents nanoseconds since some fixed but arbitrary time (perhaps in the future, so values may be negative).
这个返回值是一个从确定的值算起的,但是这个值是任意的,可能是一个未来的时间,所以返回值有可能是负数。(我的英语很蹩脚,意思应该能明白吧)
所以说这个System.nanoTime()方法只能用来计时,例如:
long s = System.nanoTime();
….
System.out.println(System.nanoTime() – s);
如何转换的System.currentTimeMillis;到秒
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。 currentTimeMillis方法 public static long currentTimeMillis() 该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。 可以直接把这个方法强制转换成date类型。 代码如下: long currentTime = System.currentTimeMillis(); SimpleDateFormat formatter = new SimpleDateFormat(“yyyy年-MM月dd日-HH时mm分ss秒“); Date date = new Date(currentTime); System.out.println(formatter.format(date)); 运行结果如下: 当前时间:2011年-08月10日-14时11分46秒 另: 可获得当前的系统和用户属性: String osName = System.getProperty(“os.name”); String user = System.getProperty(“user.name”); System.out.println(“当前操作系统是:” + osName); System.out.println(“当前用户是:” + user); System.getProperty 这个方法可以得到很多系统的属性。
JAVA System.currentTimeMillis();时间的问题
System.currentTimeMillis()和new Date().getTime() 获取的都是自1970年至今的毫秒时间,但是这里的今是指的国际标准时。
直接输出new Date()对象时候,toString方法做了时区转换,自动加上当前时区的变化量(东八区(北京) 直接+8)
所以,做取余变化得到的小时数值是标准时,+8才是北京时间。而分钟和秒不存在这个问题,也就无需变换
java中的system.currenttimemillis()是什么东西
System.currentTimeMillis() 获得的是自1970-1-01 00:00:00.000 到当前时刻的时间距离,类型为long
currenttimemillis 与gettime
当然用前一个
你可以看看Date的源码
Date的空构造方法也是调用前一个方法的
大概是: this(System.currentTimeMillis());
如果你仅仅是算时间差,就用第一个
变动得很厉害
就说明你的程序里存在着变动很大的东西,比如网络连接之类的
简单的办法就是运行个1000遍,求其平均值
system.currenttimemillis()会抛出异常吗
System.currentTimeMillis()是极其常用的基础Java API,广泛地用来获取时间戳或测量代码执行时长等,在我们的印象中应该快如闪电。
但实际上在并发调用或者特别频繁调用它的情况下(比如一个业务繁忙的接口,或者吞吐量大的需要取得时间戳的流式程序),其性能表现会令人大跌眼镜。
直接看下面的Demo:
public class CurrentTimeMillisPerfDemo {
private static final int COUNT = 100;
public static void main(String args) throws Exception {
long beginTime = System.nanoTime();
for (int i = 0; i 《 COUNT; i++) {
System.currentTimeMillis();
}
long elapsedTime = System.nanoTime() – beginTime;
System.out.println(“100 System.currentTimeMillis() serial calls: “ + elapsedTime + “ ns“);
CountDownLatch startLatch = new CountDownLatch(1);
CountDownLatch endLatch = new CountDownLatch(COUNT);
for (int i = 0; i 《 COUNT; i++) {
new Thread(() -》 {
try {
startLatch.await();
System.currentTimeMillis();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
endLatch.countDown();
}
}).start();
}
beginTime = System.nanoTime();
startLatch.countDown();
endLatch.await();
elapsedTime = System.nanoTime() – beginTime;
System.out.println(“100 System.currentTimeMillis() parallel calls: “ + elapsedTime + “ ns“);
}
}
执行结果如下图。
可见,并发调用System.currentTimeMillis()一百次,耗费的时间是单线程调用一百次的250倍。
如果单线程的调用频次增加(比如达到每毫秒数次的地步),也会观察到类似的情况。关注公众号Java技术栈可以获取 JVM 和多线程及更多面试题及答案。
实际上在极端情况下,System.currentTimeMillis()的耗时甚至会比创建一个简单的对象实例还要多,看官可以自行将上面线程中的语句换成newHashMap《》之类的试试看。
为什么会这样呢?
来到HotSpot源码的hotspot/src/os/linux/vm/os_linux.cpp文件中,有一个javaTimeMillis()方法,这就是System.currentTimeMillis()的native实现。
jlong os::javaTimeMillis() {
timeval time;
int status = gettimeofday(&time, NULL);
assert(status != -1, “linux error“);
return jlong(time.tv_sec) * 1000 + jlong(time.tv_usec / 1000);
}
java中.currentTimeMillis的用法和含义
用法:
可以用法获取当前时间的毫秒数,可以通过毫秒数进行时间比较,时间转化以及时间格式化等。
public class SystemTime {
public static void main(String args) {
//定义当时运行的时间变量
Long time = System.currentTimeMillis();
//打印开始时间的毫秒数
System.out.println(time);
for(int i =0;i《10000;i++){
//什么都不用做
}
System.out.println(“for循环运行的所需要时间(毫秒数)“+(System.currentTimeMillis()-time));
System.out.println(“for循环运行的所需要时间(秒)“+(System.currentTimeMillis()-time)/1000);
System.out.println(“显示当前时间:“+new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss“).format(System.currentTimeMillis()));
}
}
含义:
主要是返回以毫秒为单位的当前时间,值的粒度取决于不同的操作系统:
java是如何获取currentTimeMillis的
java中通过
System.currentTimeMillis();
来获取当前时间
在System类中是这样定义的
public static native long currentTimeMillis();
可以看到是个native方法
这里java通过native调用非java接口来实现获取操作系统当前时间
java long currentTime = System.currentTimeMillis();问题
system.currenttimemillis();返回的是以毫秒为单位的当前时间,把时,分,秒,的单位都转化为毫秒了,就比如说1317275380357
就是13:49,多少秒,多少毫秒,我就不知道了,
while循环的条件是,在次执行方法得到的毫秒时间,减去,上一次方法运行的时间(就是变量time),得到的值,小于1000
就执行while里面的代码,如果值=或》
1000的时候就停止执行