新聞中心
時(shí)間戳是指某一個(gè)時(shí)間點(diǎn)距離基準(zhǔn)時(shí)間的時(shí)間差,通常指Unix時(shí)間戳,表示從1970年1月1日0時(shí)0分0秒(UTC+00:00)開(kāi)始所經(jīng)過(guò)的秒數(shù)。在Linux系統(tǒng)中,時(shí)間戳是很常見(jiàn)的一種時(shí)間表示方式,而作為Java程序開(kāi)發(fā)人員,也需要經(jīng)常獲取Linux系統(tǒng)中的時(shí)間戳信息。如何在Java中獲取Linux的時(shí)間戳呢?下面將為您一一介紹。

“專業(yè)、務(wù)實(shí)、高效、創(chuàng)新、把客戶的事當(dāng)成自己的事”是我們每一個(gè)人一直以來(lái)堅(jiān)持追求的企業(yè)文化。 創(chuàng)新互聯(lián)公司是您可以信賴的網(wǎng)站建設(shè)服務(wù)商、專業(yè)的互聯(lián)網(wǎng)服務(wù)提供商! 專注于成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、軟件開(kāi)發(fā)、設(shè)計(jì)服務(wù)業(yè)務(wù)。我們始終堅(jiān)持以客戶需求為導(dǎo)向,結(jié)合用戶體驗(yàn)與視覺(jué)傳達(dá),提供有針對(duì)性的項(xiàng)目解決方案,提供專業(yè)性的建議,創(chuàng)新互聯(lián)建站將不斷地超越自我,追逐市場(chǎng),引領(lǐng)市場(chǎng)!
一、通過(guò)Java代碼獲取當(dāng)前時(shí)間戳
Java中獲取時(shí)間戳的方式比較簡(jiǎn)單,可以通過(guò)java.util包中提供的Date類實(shí)現(xiàn)。其中,getTime()方法返回的就是自1970年1月1日0時(shí)0分0秒以來(lái)的毫秒數(shù),即Unix時(shí)間戳,可以將其除以1000得到秒數(shù)。
下面來(lái)看一個(gè)簡(jiǎn)單的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(“當(dāng)前時(shí)間戳為:” + timestamp);
}
}
“`
在這個(gè)示例中,我們使用了Date類獲取了當(dāng)前的時(shí)間,然后將其毫秒數(shù)除以1000得到了秒數(shù),最后打印輸出了當(dāng)前的時(shí)間戳。
二、通過(guò)Java代碼獲取Linux系統(tǒng)時(shí)間戳
如果需要在Java程序中獲取Linux系統(tǒng)的時(shí)間戳,那么就需要通過(guò)Linux系統(tǒng)的API來(lái)實(shí)現(xiàn)。在Linux系統(tǒng)中,可以通過(guò)執(zhí)行`date +%s`命令來(lái)獲取當(dāng)前時(shí)間戳,我們可以在Java程序中使用命令行執(zhí)行該命令,并將結(jié)果獲取到。
下面的Java代碼是一個(gè)示例:
“`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系統(tǒng)時(shí)間戳為:” + line);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
“`
在這個(gè)示例中,我們通過(guò)執(zhí)行`date +%s`命令獲取了Linux系統(tǒng)的時(shí)間戳,并通過(guò)Java代碼解析輸出內(nèi)容來(lái)獲取時(shí)間戳信息,最終打印輸出了獲取到的時(shí)間戳。
三、通過(guò)Java代碼獲取NTP時(shí)間戳
如果需要獲取更加精確的時(shí)間戳,可以使用NTP(Network Time Protocol)協(xié)議來(lái)獲取標(biāo)準(zhǔn)的UTC時(shí)間,然后將UTC時(shí)間轉(zhuǎn)換為Unix時(shí)間戳即可。在Java中,可以使用開(kāi)源庫(kù)Apache Commons Net來(lái)實(shí)現(xiàn)。
下面的Java代碼演示了如何使用Apache Commons Net庫(kù)獲取NTP服務(wù)器時(shí)間戳:
“`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時(shí)間戳為:” +
(timestamp/1000 – 2202388800L));
client.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
“`
在這個(gè)示例中,我們使用了常用的NTP服務(wù)器地址,并通過(guò)Apache Commons Net庫(kù)中提供的NTPUDPClient類獲取了NTP服務(wù)器時(shí)間戳信息。通過(guò)解析輸出內(nèi)容可知,在獲取到的時(shí)間戳數(shù)值上需要減去一個(gè)偏移量2202388800L,才能得到Unix時(shí)間戳。
通過(guò)上述三個(gè)示例,我們可以看到,獲取Linux系統(tǒng)的時(shí)間戳并不復(fù)雜,但是需要根據(jù)實(shí)際需要選擇相應(yīng)的方案。對(duì)于一些需要精確時(shí)間戳的場(chǎng)景,使用NTP協(xié)議獲取的時(shí)間戳是更好的選擇,而對(duì)于簡(jiǎn)單地獲取當(dāng)前時(shí)間戳,則可以使用Java內(nèi)置的Date類。無(wú)論哪種方式,都可以輕松獲取到Linux系統(tǒng)中的時(shí)間戳信息。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗(yàn)豐富以策略為先導(dǎo)10多年以來(lái)專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站制作,設(shè)計(jì)師量身打造品牌風(fēng)格,熱線:028-86922220linux怎么用c獲取當(dāng)前時(shí)間
Linux C編程獲取當(dāng)前時(shí)間用time這個(gè)函數(shù),time函數(shù)會(huì)返回一個(gè)time_t類型的時(shí)間戳(這個(gè)time_t類型實(shí)際上是一個(gè)長(zhǎng)整型,定義在time.h頭文件中)。time函數(shù)的函數(shù)原型族塵吵是這樣的:
time_t time(time_t *tloc);
使用time函數(shù)需要包含time.h頭文件:
#include
調(diào)用time函數(shù)的代碼是這樣的:
time_t t;
t=time((time_t *) 0);
因?yàn)閠ime函數(shù)參數(shù)的作用和返回值一樣,只是用于接收時(shí)間戳,所以這里調(diào)用time函數(shù)可以傳入一個(gè)空指針,表示只用它的返回值,不用指針參數(shù)來(lái)接收兄困時(shí)間戳。
因?yàn)檎资蘴ime函數(shù)只是返回一個(gè)時(shí)間戳,如果想打印直觀的時(shí)間信息,可以把剛才的time_t作為參數(shù)調(diào)用ctime函數(shù),ctime函數(shù)會(huì)返回一個(gè)字符串,ctime函數(shù)的調(diào)用是這樣的:
printf(“The time and date is: %s”, ctime(&t));
t就是剛才調(diào)用time函數(shù)返回的time_t類型變量。
system.currenttimemillis()會(huì)拋出異常嗎
System.currentTimeMillis()是極其常用的基礎(chǔ)Java API,廣泛地用來(lái)獲取時(shí)間戳或測(cè)量代碼執(zhí)行時(shí)長(zhǎng)等,在我們的印象中應(yīng)該快如閃電。
但實(shí)際上在并發(fā)調(diào)用或者特別頻繁調(diào)用它的情況下(比如一個(gè)業(yè)務(wù)繁忙的接口,或者吞吐量大的需要取得時(shí)間戳的流式程序),其性能表現(xiàn)會(huì)令人大跌眼鏡。
直接看下面的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”);
}
}
執(zhí)行結(jié)果如下圖。
可見(jiàn),并發(fā)調(diào)用System.currentTimeMillis()一百次,耗費(fèi)的時(shí)間是單線程調(diào)用一百次的250倍。
如果單線程的調(diào)用頻次增加(比如達(dá)到每毫秒數(shù)次的地步),也會(huì)觀察到類似的情況。關(guān)注公眾號(hào)Java技術(shù)棧可以獲取 JVM 和多線程及更多面試題及答案。
實(shí)際上在極端情況下,System.currentTimeMillis()的耗時(shí)甚至?xí)葎?chuàng)建一個(gè)簡(jiǎn)單的對(duì)象實(shí)例還要多,看官可以自行將上面線程中的語(yǔ)句換成newHashMap之類的試試看。
為什么會(huì)這樣呢?
來(lái)到HotSpot源碼的hotspot/src/os/linux/vm/os_linux.cpp文件中,有一個(gè)javaTimeMillis()方法,這就是System.currentTimeMillis()的native實(shí)現(xiàn)。
jlong os::javaTimeMillis() {
timeval time;
int status = gettimeofday(&time, NULL);
assert(status != -1, “l(fā)inux error”);
return jlong(time.tv_sec) *+ jlong(time.tv_usec / 1000);
}
簡(jiǎn)單來(lái)講就是:
調(diào)用gettimeofday()需要從用戶態(tài)切換到內(nèi)核態(tài);
gettimeofday()的表現(xiàn)受Linux系統(tǒng)的計(jì)時(shí)器(時(shí)鐘源)影響,在HPET計(jì)時(shí)器下性能尤其差;
系統(tǒng)只有一個(gè)全局時(shí)鐘源,高并發(fā)或頻繁訪問(wèn)會(huì)造成嚴(yán)重的爭(zhēng)用。
HPET計(jì)時(shí)器性能較差的原因是會(huì)將所有對(duì)時(shí)間戳的請(qǐng)求串行執(zhí)行。TSC計(jì)時(shí)器性能較好,因?yàn)橛袑S玫募拇嫫鱽?lái)保存時(shí)間戳。缺點(diǎn)是可能不穩(wěn)定,因?yàn)樗羌冇布挠?jì)時(shí)器,頻率可變(與處理器的CLK信號(hào)有關(guān))。
關(guān)于HPET和TSC的細(xì)節(jié)可以參見(jiàn):
另外,可以用以下的命令查看和修改時(shí)鐘源。
~ 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
如何解決這個(gè)問(wèn)題?
最常見(jiàn)的辦法是用單個(gè)調(diào)度線程來(lái)按毫秒更新時(shí)間戳,相當(dāng)于維護(hù)一個(gè)全局緩存。其他線程取時(shí)間戳?xí)r相當(dāng)于從內(nèi)存取,不會(huì)再造成時(shí)鐘資源的爭(zhēng)用,代價(jià)就是犧牲了一些精確度。
具體代碼如下:
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();
}
}
使用的時(shí)候,直接CurrentTimeMillisClock.getInstance().now()就可以了。
不過(guò),在System.currentTimeMillis()的效率沒(méi)有影響程序整體的效率時(shí),就不必忙著做優(yōu)化,這只是為極端情況準(zhǔn)備的。
java 獲取linux時(shí)間戳的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于java 獲取linux時(shí)間戳,Java如何獲取Linux的時(shí)間戳,linux怎么用c獲取當(dāng)前時(shí)間,system.currenttimemillis()會(huì)拋出異常嗎的信息別忘了在本站進(jìn)行查找喔。
成都創(chuàng)新互聯(lián)科技有限公司,經(jīng)過(guò)多年的不懈努力,公司現(xiàn)已經(jīng)成為一家專業(yè)從事IT產(chǎn)品開(kāi)發(fā)和營(yíng)銷公司。廣泛應(yīng)用于計(jì)算機(jī)網(wǎng)絡(luò)、設(shè)計(jì)、SEO優(yōu)化、關(guān)鍵詞排名等多種行業(yè)!
網(wǎng)站題目:Java如何獲取Linux的時(shí)間戳(java獲取linux時(shí)間戳)
URL分享:http://www.dlmjj.cn/article/djgicjs.html


咨詢
建站咨詢
