为什么kdb + epoch日期是2000.01.01?

时间:2017-11-22 17:08:29

标签: kdb q-lang

我是kdb +的新手,我想知道为什么kdb的2000.01.01的纪元日期与unix(1970.01.01)的纪元日期不同。

这些差异会影响与操作系统或其他语言的任何交互吗?

3 个答案:

答案 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意味着对方无论如何都不匹配。进一步阅读该页面还表明,许多其他语言也使用自己独特的纪元日期和范围。

简而言之,语言无需使用运行的操作系统的纪元时间。