Java如何获取Linux的时间戳 (java 获取linux时间戳)

时间戳是指某一个时间点距离基准时间的时间差,通常指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系统中的时间戳信息。

相关问题拓展阅读:

linux怎么用c获取当前时间

Linux 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()会抛出异常吗

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()会抛出异常吗的信息别忘了在本站进行查找喔。


数据运维技术 » Java如何获取Linux的时间戳 (java 获取linux时间戳)