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

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


咨詢
建站咨詢
