日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Java如何獲取Linux的時(shí)間戳(java獲取linux時(shí)間戳)

時(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-86922220

linux怎么用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