时间戳是指某一个时间点距离基准时间的时间差,通常指Unix时间戳,表示从1970年1月1日0时0分0秒(UTC+00:00)开始所经过的秒数。在Linux系统中,时间戳是很常见的一种时间表示方式,而作为Java程序开发人员,也需要经常获取Linux系统中的时间戳信息。如何在Java中获取Linux的时间戳呢?下面将为您一一介绍。
“专业、务实、高效、创新、把客户的事当成自己的事”是我们每一个人一直以来坚持追求的企业文化。 创新互联公司是您可以信赖的网站建设服务商、专业的互联网服务提供商! 专注于成都做网站、成都网站设计、软件开发、设计服务业务。我们始终坚持以客户需求为导向,结合用户体验与视觉传达,提供有针对性的项目解决方案,提供专业性的建议,创新互联建站将不断地超越自我,追逐市场,引领市场!
一、通过Java代码获取当前时间戳
Java中获取时间戳的方式比较简单,可以通过java.util包中提供的Date类实现。其中,getTime()方法返回的就是自1970年1月1日0时0分0秒以来的毫秒数,即Unix时间戳,可以将其除以1000得到秒数。
下面来看一个简单的Java示例代码:
“`java
import java.util.Date;
public class TimestampDemo {
public static void mn(String[] args) {
Date date = new Date();
long timestamp = date.getTime()/1000;
System.out.println(“当前时间戳为:” + timestamp);
}
}
“`
在这个示例中,我们使用了Date类获取了当前的时间,然后将其毫秒数除以1000得到了秒数,最后打印输出了当前的时间戳。
二、通过Java代码获取Linux系统时间戳
如果需要在Java程序中获取Linux系统的时间戳,那么就需要通过Linux系统的API来实现。在Linux系统中,可以通过执行`date +%s`命令来获取当前时间戳,我们可以在Java程序中使用命令行执行该命令,并将结果获取到。
下面的Java代码是一个示例:
“`java
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class LinuxTimestampDemo {
public static void mn(String[] args) {
String cmd = “date +%s”;
String[] cmds = {“/bin/bash”, “-c”, cmd};
try {
Process ps = Runtime.getRuntime().exec(cmds);
BufferedReader br = new BufferedReader(new
InputStreamReader(ps.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(“Linux系统时间戳为:” + line);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
“`
在这个示例中,我们通过执行`date +%s`命令获取了Linux系统的时间戳,并通过Java代码解析输出内容来获取时间戳信息,最终打印输出了获取到的时间戳。
三、通过Java代码获取NTP时间戳
如果需要获取更加精确的时间戳,可以使用NTP(Network Time Protocol)协议来获取标准的UTC时间,然后将UTC时间转换为Unix时间戳即可。在Java中,可以使用开源库Apache Commons Net来实现。
下面的Java代码演示了如何使用Apache Commons Net库获取NTP服务器时间戳:
“`java
import java.io.IOException;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import org.apache.commons.net.ntp.NTPUDPClient;
import org.apache.commons.net.ntp.TimeInfo;
public class NtpTimestampDemo {
public static void mn(String[] args) {
String[] servers = new String[]{“0.pool.ntp.org”, “1.pool.ntp.org”,
“2.pool.ntp.org”, “3.pool.ntp.org”};
for(String server : servers){
try {
NTPUDPClient client = new NTPUDPClient();
InetAddress address = InetAddress.getByName(server);
TimeInfo info = client.getTime(address);
long timestamp = info.getMessage().getTranitTimeStamp().getTime();
System.out.println(server + ” NTP时间戳为:” +
(timestamp/1000 – 2202388800L));
client.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
“`
在这个示例中,我们使用了常用的NTP服务器地址,并通过Apache Commons Net库中提供的NTPUDPClient类获取了NTP服务器时间戳信息。通过解析输出内容可知,在获取到的时间戳数值上需要减去一个偏移量2202388800L,才能得到Unix时间戳。
通过上述三个示例,我们可以看到,获取Linux系统的时间戳并不复杂,但是需要根据实际需要选择相应的方案。对于一些需要精确时间戳的场景,使用NTP协议获取的时间戳是更好的选择,而对于简单地获取当前时间戳,则可以使用Java内置的Date类。无论哪种方式,都可以轻松获取到Linux系统中的时间戳信息。
成都网站建设公司-创新互联,建站经验丰富以策略为先导10多年以来专注数字化网站建设,提供企业网站建设,高端网站设计,响应式网站制作,设计师量身打造品牌风格,热线:028-86922220Linux C编程获取当前时间用time这个函数,time函数会返回一个time_t类型的时间戳(这个time_t类型实际上是一个长整型,定义在time.h头文件中)。time函数的函数原型族尘吵是这样的:
time_t time(time_t *tloc);
使用time函数需要包含time.h头文件:
#include
调用time函数的代码是这样的:
time_t t;
t=time((time_t *) 0);
因为time函数参数的作用和返回值一样,只是用于接收时间戳,所以这里调用time函数可以传入一个空指针,表示只用它的返回值,不用指针参数来接收兄困时间戳。
因为兆侍time函数只是返回一个时间戳,如果想打印直观的时间信息,可以把刚才的time_t作为参数调用ctime函数,ctime函数会返回一个字符串,ctime函数的调用是这样的:
printf(“The time and date is: %s”, ctime(&t));
t就是刚才调用time函数返回的time_t类型变量。
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 {
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) *+ jlong(time.tv_usec / 1000);
}
简单来讲就是:
调用gettimeofday()需要从用户态切换到内核态;
gettimeofday()的表现受Linux系统的计时器(时钟源)影响,在HPET计时器下性能尤其差;
系统只有一个全局时钟源,高并发或频繁访问会造成严重的争用。
HPET计时器性能较差的原因是会将所有对时间戳的请求串行执行。TSC计时器性能较好,因为有专用的寄存器来保存时间戳。缺点是可能不稳定,因为它是纯硬件的计时器,频率可变(与处理器的CLK信号有关)。
关于HPET和TSC的细节可以参见:
另外,可以用以下的命令查看和修改时钟源。
~ cat /sys/devices/system/clocksource/clocksource0/available_clocksource
tsc hpet acpi_pm
~ cat /sys/devices/system/clocksource/clocksource0/current_clocksource
tsc
~ echo ‘hpet’ > /sys/devices/system/clocksource/clocksource0/current_clocksource
如何解决这个问题?
最常见的办法是用单个调度线程来按毫秒更新时间戳,相当于维护一个全局缓存。其他线程取时间戳时相当于从内存取,不会再造成时钟资源的争用,代价就是牺牲了一些精确度。
具体代码如下:
public class CurrentTimeMillisClock {
private volatile long now;
private CurrentTimeMillisClock() {
this.now = System.currentTimeMillis();
scheduleTick();
}
private void scheduleTick() {
new ScheduledThreadPoolExecutor(1, runnable -> {
Thread thread = new Thread(runnable, “current-time-millis”);
thread.setDaemon(true);
return thread;
}).scheduleAtFixedRate(() -> {
now = System.currentTimeMillis();
}, 1, 1, TimeUnit.MILLISECONDS);
}
public long now() {
return now;
}
public static CurrentTimeMillisClock getInstance() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
private static final CurrentTimeMillisClock INSTANCE = new CurrentTimeMillisClock();
}
}
使用的时候,直接CurrentTimeMillisClock.getInstance().now()就可以了。
不过,在System.currentTimeMillis()的效率没有影响程序整体的效率时,就不必忙着做优化,这只是为极端情况准备的。
java 获取linux时间戳的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java 获取linux时间戳,Java如何获取Linux的时间戳,linux怎么用c获取当前时间,system.currenttimemillis()会抛出异常吗的信息别忘了在本站进行查找喔。
成都创新互联科技有限公司,经过多年的不懈努力,公司现已经成为一家专业从事IT产品开发和营销公司。广泛应用于计算机网络、设计、SEO优化、关键词排名等多种行业!
新闻标题:Java如何获取Linux的时间戳(java获取linux时间戳)
分享URL:http://www.shufengxianlan.com/qtweb/news16/499116.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联