2016-04-19 114 views
4

在java中复制datetime.datetime.now().toordinal()的最佳方法是什么? 我尝试使用时代,但结果远不及。Python的toordinal()相当于Java?

+0

你能发表你试过的和结果吗? –

+0

这是['toordinal()']的源代码(https://hg.python.org/cpython/file/3a9b47b062b9/Lib/datetime.py#l57);如果您确实需要这种行为,您可能只想将其移植到Java。 – dimo414

回答

4

没有任何直接的方法可以使用Java Time API查询这些信息,但是可以计算它。

public static void main(String[] args) { 
    long ordinal = LocalDate.now().toEpochDay() + (146097 * 5L) - (31L * 365L + 7L); 

    System.out.println(ordinal); 
} 

运行的今天,2016年4月19日,它输出736073,这与Python的输出一致。

LocalDate可以得到toEpochDay()的大纪元日。如果你看看inside the current implementation,你会发现,它实际上计算天的总数,因为0期和减去与恒

static final long DAYS_0000_TO_1970 = (DAYS_PER_CYCLE * 5L) - (30L * 365L + 7L); 

其中DAYS_PER_CYCLE = 146097是天在一个400年的周期数。这个常数不是公开的,所以我们不能直接重用它。

toordinal()的Python文档中,它定义第1年的序数为1.上面的Java API的演算假设它是第0年,所以我们只需要对此进行调整。