1)c#中的
DateTime.Now.ToBinary()
go中实现
// C# Time Tick = 100纳秒
const CSharpTickNanos int64 = 100
// C# 的时间起点:0001年1月1日 00:00:00 UTC
var CSharpEpoch time.Time = time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC)
// Unix Epoch (1970-01-01 00:00:00 UTC) 相对于 C# Epoch (0001-01-01 00:00:00 UTC) 的 Ticks 数量
// 这是一个精确的常量,用于修正 Go 语言 time.Time 内部表示的不足。
const UnixEpochToCSharpEpochTicks uint64 = 621355968000000000
// 标志位掩码
const (
KindMask uint64 = 0xC000000000000000 // 1100...
KindLocal uint64 = 0x8000000000000000
KindUtc uint64 = 0x4000000000000000
)
// ToBinary 模拟 C# 的 DateTime.Now.ToBinary() 方法。
// 核心逻辑:将本地时间减去其时区偏移量,得到一个等效的 UTC 时间点,
// 然后计算该 UTC 时间点距离 C# Epoch 的刻度数,并编码 KindLocal。
func ToBinary(t time.Time) int64 {
// 1. 确保时间点是 UTC,这是 C# ToBinary() 的核心步骤。
// t.In(time.UTC) 确保了时区转换的正确性,包括夏令时。
utcTime := t.In(time.UTC)
// 2. 获取时间点距离 Unix Epoch (1970) 的纳秒数
nanosSinceUnixEpoch := utcTime.UnixNano()
// 3. 将纳秒转换为 Ticks
ticksSinceUnixEpoch := uint64(nanosSinceUnixEpoch / CSharpTickNanos)
// 4. 加上 Unix Epoch 之前的 Ticks 偏移量,得到 Ticks Since C# Epoch
ticksSinceCSharpEpoch := ticksSinceUnixEpoch + UnixEpochToCSharpEpochTicks
// 5. 编码 Kind 信息 (Local)
binaryValue := ticksSinceCSharpEpoch | KindLocal
return int64(binaryValue)
}
主要问题
C# 的时间起点:0001年1月1日 00:00:00 UTC
go的计时起点:Unix Epoch (1970-01-01 00:00:00 UTC)
相对于 C# Epoch (0001-01-01 00:00:00 UTC) 的固定偏移量
const UnixEpochToCSharpEpochTicks uint64 = 621355968000000000
2)masstransit的exchange类型,publish和send到队列
c#中 send到队列 没有成功,但用publish到一个新的类型成功了;