goldapad域WindowsNT時(shí)間與Unix時(shí)間轉(zhuǎn)換的方法

這篇文章主要講解了“go ldap ad域 Windows NT時(shí)間與Unix時(shí)間轉(zhuǎn)換的方法”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“go ldap ad域 Windows NT時(shí)間與Unix時(shí)間轉(zhuǎn)換的方法”吧!

創(chuàng)新互聯(lián)始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營(yíng)理念,通過(guò)多達(dá)10多年累計(jì)超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的全網(wǎng)整合營(yíng)銷推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:成都純水機(jī)等企業(yè),備受客戶夸獎(jiǎng)。

AD域來(lái)自windows,其設(shè)計(jì)了Window NT時(shí)間(表示從1602年1月1日UTC時(shí)間開始的100納秒數(shù))

因?yàn)橐獙D域用戶的accountExpires賬戶過(guò)期時(shí)間進(jìn)行修改來(lái)控制該用戶自動(dòng)過(guò)期的機(jī)制,所以要將Window NT與Unix時(shí)間進(jìn)行互相轉(zhuǎn)換。

首先,我們?cè)谧x取并解析用ldap協(xié)議查詢出來(lái)的AD域用戶賬號(hào)過(guò)期時(shí)間,將Window NT轉(zhuǎn)換為Unix時(shí)間;

其次,在創(chuàng)建用戶的時(shí)候,根據(jù)提交的工單信息,需要為新賬號(hào)指定一個(gè)過(guò)期時(shí)間,將當(dāng)前Unix時(shí)間加上幾個(gè)月的過(guò)期時(shí)間,賦值給accountExpires

最后,當(dāng)有賬號(hào)已經(jīng)過(guò)期,使用不了的時(shí)候,用戶會(huì)提交賬號(hào)重新激活工單,自動(dòng)為該賬號(hào)續(xù)期;【一:賬號(hào)正常過(guò)期,續(xù)6個(gè)月之類的; 二:重復(fù)提交創(chuàng)建賬號(hào)申請(qǐng),不處理發(fā)企業(yè)微信通知告知已經(jīng)有賬號(hào)了,告知對(duì)方賬號(hào)創(chuàng)建和最后修改時(shí)間,讓對(duì)方查看企業(yè)微信消息/郵件,如果沒(méi)有找到賬號(hào)密碼消息,請(qǐng)直接提交密碼找回工單(將收到賬號(hào)和新密碼)】

golang原生time包的Duration時(shí)間段

A Duration represents the elapsed time between two instants as an int64 nanosecond count. The representation limits the largest representable duration to approximately 290 years.

僅僅支持最大為290年的時(shí)間段,而windows nt時(shí)間為1601年開始,到現(xiàn)今是420多年,根本無(wú)法適配,在不采用第三方庫(kù)的情況下該如何處理呢? 犯迷糊了,怎么將unix時(shí)間轉(zhuǎn)換為nt時(shí)間,則反過(guò)來(lái)計(jì)算只需要計(jì)算出正確的unix時(shí)間戳然后將時(shí)間戳轉(zhuǎn)換為時(shí)間類型即可。

// maxDuration Duration = 1<<63 - 1
fmt.Println(time.Duration(1<<63 - 1))
2562047h57m16.854775807s
292.47111872146 年

Window NT 時(shí)間轉(zhuǎn)換為 Unix 時(shí)間

// Window NT 時(shí)間轉(zhuǎn)換為 Unix 時(shí)間
func NtToUnix(ntTime int64) (unixTime time.Time) {
	ntTime = (ntTime - 1.1644473600125e+17) / 1e+7
	return time.Unix(int64(ntTime), 0)
}

測(cè)試

func TestNtTimeToDatetime(t *testing.T) {
	// 取當(dāng)前時(shí)間轉(zhuǎn)換為nt時(shí)間
	timestamp := time.Now().Unix()*1e+7 + 1.1644473600125e+17
	fmt.Println(timestamp)
	// 將nt時(shí)間轉(zhuǎn)換為unix時(shí)間
	res := NtToUnix(timestamp)
	fmt.Println(res)
}

Unix 時(shí)間轉(zhuǎn)換為 Window NT 時(shí)間

// Unix 時(shí)間轉(zhuǎn)換為 Window NT 時(shí)間
func UnixToNt(expireTime time.Time) (ntTimestamp int64) {
	ntTimestamp = expireTime.Unix()*int64(1e+7) + int64(1.1644473600125e+17)
	return
}

測(cè)試

func TestUnixTimeToNtTime(t *testing.T) {
	// 當(dāng)前時(shí)間
	unixTime := time.Now()
	// 當(dāng)前時(shí)間往后推遲6個(gè)月
	unixTime.AddDate(0, 6, 0)
	res := UnixToNt(unixTime)
	fmt.Println(res)
}

用戶過(guò)期期限處理

// 用戶過(guò)期期限處理 月份為-1 則過(guò)期時(shí)間為永久;否則 當(dāng)前時(shí)間往后推遲expireMouths個(gè)月
func expireTime(expireMouths int64) (expireTimestamp int64) {
	expireTimestamp = 9223372036854775807
	if expireMouths != -1 {
		expireTimestamp = util.UnixToNt(time.Now().AddDate(0, int(expireMouths), 0))
	}
	return
}

python中的寫法

import datetime
import time

from dateutil.relativedelta import relativedelta


def expire_time(expire_mouths: int) -> int:
    '''用戶賬號(hào)過(guò)期邏輯
    '''
    expire_timestamp = 9223372036854775807
    if expire_mouths != -1:
        expire_timestamp = unix_2_nt(
            datetime.datetime.now() + relativedelta(months=expire_mouths))
    return expire_timestamp


def unix_2_nt(expire_time: datetime) -> int:
    '''Unix 時(shí)間轉(zhuǎn)換為 Window NT 時(shí)間
    '''
    return time.mktime(expire_time.timetuple()) * 1e+7 + 1.1644473600125e+17


def nt_2_unix(nt_time):
    '''winows時(shí)間轉(zhuǎn)換為unix時(shí)間
    '''
    return datetime.datetime(1601, 1, 1) + datetime.timedelta(microseconds=nt_time//10)


if __name__ == '__main__':
    print(expire_time(6))
    print(nt_2_unix(1.3281000774125e+17))

感謝各位的閱讀,以上就是“go ldap ad域 Windows NT時(shí)間與Unix時(shí)間轉(zhuǎn)換的方法”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)go ldap ad域 Windows NT時(shí)間與Unix時(shí)間轉(zhuǎn)換的方法這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

分享名稱:goldapad域WindowsNT時(shí)間與Unix時(shí)間轉(zhuǎn)換的方法
網(wǎng)頁(yè)路徑:http://muchs.cn/article30/gdcgso.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、標(biāo)簽優(yōu)化、、移動(dòng)網(wǎng)站建設(shè)外貿(mào)建站、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)