您好,登錄后才能下訂單哦!
這篇文章主要講解了“go ldap ad域 Windows NT時間與Unix時間轉換的方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“go ldap ad域 Windows NT時間與Unix時間轉換的方法”吧!
AD域來自windows,其設計了Window NT時間(表示從1602年1月1日UTC時間開始的100納秒數)
因為要將AD域用戶的accountExpires
賬戶過期時間進行修改來控制該用戶自動過期的機制,所以要將Window NT與Unix時間進行互相轉換。
首先,我們在讀取并解析用ldap協議查詢出來的AD域用戶賬號過期時間,將Window NT轉換為Unix時間;
其次,在創建用戶的時候,根據提交的工單信息,需要為新賬號指定一個過期時間,將當前Unix時間加上幾個月的過期時間,賦值給accountExpires
;
最后,當有賬號已經過期,使用不了的時候,用戶會提交賬號重新激活工單,自動為該賬號續期;【一:賬號正常過期,續6個月之類的; 二:重復提交創建賬號申請,不處理發企業微信通知告知已經有賬號了,告知對方賬號創建和最后修改時間,讓對方查看企業微信消息/郵件,如果沒有找到賬號密碼消息,請直接提交密碼找回工單(將收到賬號和新密碼)】
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年的時間段,而windows nt時間為1601年開始,到現今是420多年,根本無法適配,在不采用第三方庫的情況下該如何處理呢? 犯迷糊了,怎么將unix時間轉換為nt時間,則反過來計算只需要計算出正確的unix時間戳然后將時間戳轉換為時間類型即可。
// maxDuration Duration = 1<<63 - 1 fmt.Println(time.Duration(1<<63 - 1)) 2562047h57m16.854775807s 292.47111872146 年
// Window NT 時間轉換為 Unix 時間 func NtToUnix(ntTime int64) (unixTime time.Time) { ntTime = (ntTime - 1.1644473600125e+17) / 1e+7 return time.Unix(int64(ntTime), 0) }
測試
func TestNtTimeToDatetime(t *testing.T) { // 取當前時間轉換為nt時間 timestamp := time.Now().Unix()*1e+7 + 1.1644473600125e+17 fmt.Println(timestamp) // 將nt時間轉換為unix時間 res := NtToUnix(timestamp) fmt.Println(res) }
// Unix 時間轉換為 Window NT 時間 func UnixToNt(expireTime time.Time) (ntTimestamp int64) { ntTimestamp = expireTime.Unix()*int64(1e+7) + int64(1.1644473600125e+17) return }
測試
func TestUnixTimeToNtTime(t *testing.T) { // 當前時間 unixTime := time.Now() // 當前時間往后推遲6個月 unixTime.AddDate(0, 6, 0) res := UnixToNt(unixTime) fmt.Println(res) }
// 用戶過期期限處理 月份為-1 則過期時間為永久;否則 當前時間往后推遲expireMouths個月 func expireTime(expireMouths int64) (expireTimestamp int64) { expireTimestamp = 9223372036854775807 if expireMouths != -1 { expireTimestamp = util.UnixToNt(time.Now().AddDate(0, int(expireMouths), 0)) } return }
import datetime import time from dateutil.relativedelta import relativedelta def expire_time(expire_mouths: int) -> int: '''用戶賬號過期邏輯 ''' 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 時間轉換為 Window NT 時間 ''' return time.mktime(expire_time.timetuple()) * 1e+7 + 1.1644473600125e+17 def nt_2_unix(nt_time): '''winows時間轉換為unix時間 ''' 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時間與Unix時間轉換的方法”的內容了,經過本文的學習后,相信大家對go ldap ad域 Windows NT時間與Unix時間轉換的方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。