我是kdb +的新手,我想知道为什么kdb的2000.01.01的纪元日期与unix(1970.01.01)的纪元日期不同。
这些差异会影响与操作系统或其他语言的任何交互吗?
答案 0 :(得分:2)
KDB +使用不同的纪元,因为它遵循不同的标准。 KDB +遵循J2000国际标准,该标准基于Julian年。
UNIX使用POSIX时间,最初是32位无符号整数。因为时间计算为60秒,所以32位整数只能工作大约829天,因此必须选择最近的日期。
1971年11月3日的第一版Unix程序员手册将Unix时间定义为“自1971年1月1日00:00:00以来,以六十分之一秒计算的时间”
如果在将选定的纪元时间用于应用程序之前不确保转换为一个标准,这种差异可能会导致问题。
答案 1 :(得分:0)
有关与系统/其他语言交互的问题应该能够通过KDB解析UNIX纪元时间戳的事实来处理
来自http://code.kx.com/q/ref/casting/#tok
解析Unix时间戳(自Unix纪元以来的秒数),字符串为 9 ... 11位数:
q)"P"$"10129708800" 2290.12.31D00:00:00.000000000 q)"P"$"00000000000" 1970.01.01D00:00:00.000000000
答案 2 :(得分:0)
Kdb +可用于许多不同的操作系统,目前可从kx下载Windows,Linux-x86,Linux-ARM和OSX,之前提供solaris。
在维基百科上的system time页面中,我们可以看到各种操作系统使用不同的纪元日期和范围。考虑到kdb +支持的两个操作系统,我们可以看到它们具有不同的历元范围:
public class Storm : MonoBehaviour {
[SerializeField] private PlayerVitals playerVitals;
[SerializeField] private bool health;
[SerializeField] private float value;
public float waitTime = 1f;
float timer;
void Start () {
InvokeRepeating ("OnTriggerEnter", 0.0f, 1.0f);
}
// Update is called once per frame
void Update () {
}
IEnumerator OnTriggerEnter (Collider col)
{
if (col.gameObject.tag == "storm") {
playerVitals.healthSlider.value -= value;
yield return new WaitForSeconds (1);
}
}
IEnumerator OnTriggerExit (Collider col){
if (col.gameObject.tag == "storm") {
playerVitals.healthSlider.value += value;
yield return new WaitForSeconds (1);
}
}
}
使用linux或windows epoch意味着对方无论如何都不匹配。进一步阅读该页面还表明,许多其他语言也使用自己独特的纪元日期和范围。
简而言之,语言无需使用运行的操作系统的纪元时间。