将日期yyyymmdd转换为yyJJJ或Julian Date

时间:2011-09-30 14:47:52

标签: c# excel

需要excel中的公式和c#将“yyyymmdd”格式的数据转换为julian日期格式“yyJJJ”吗? “JJJ”是提交的Julian日期。 JJJ是1到365或999或366的数字吗?我不认为它是366,但我们确实有闰年所以它可能是闰年。

在Excel中我试图使用以下内容:

 =Year() & DAYS360("20110101","20110930")

在C#中,我使用now()来获取当前日期。但我想要1月1日和当前日期之间的天数。不确定这是否是正确的原型公式:

Prepend Two digit year format to the following
    Number of Days between "20110101" and "20110930" in "YY" format 

4 个答案:

答案 0 :(得分:12)

您可以简单地使用JulianCalendar class

,而不是自己在C#中处理此问题

今天要进入儒略历,你可以这样做:

JulianCalendar calendar = new JulianCalendar();
var today=DateTime.Today;
var dateInJulian = calendar.ToDateTime(today.Year, today.Month, today.Day, today.Hour, today.Minute, today.Second, today.Millisecond);

编辑:

我意识到我没有帮助你找到你想要的YYJJJ格式的好方法,这很简单:

var stringResult=string.Format("{0}{1}", dateInJulian.ToString("yy"), dateInJulian.DayOfYear);

可悲的是,我认为没有相当于dateTime.ToString("JJJ");会给出一年中的那一天,因此我的小string.Format()可以解决这个问题,但它的效果也一样!

EDIT2:

所以Phoog在评论中对我进行了一些教育,并指出你今天没有在Julian日历中寻找,这就是上面的代码将给出的JulianCalendar类。相反,它似乎你正在寻找序数日期(这篇文章为未来的读者澄清添加)。我将离开上面,以便有人不会犯同样的错误。我相信,你真正想要的是第一次编辑的代码,但没有JulianCalendar业务,所以:

var dateToConvert = DateTime.Today // Or any other date you want!
var stringResult=string.Format("{0}{1}", dateToConvert.ToString("yy"), dateToConvert.DayOfYear);

答案 1 :(得分:5)

根据这些文章,你应该使用“序数日期”而不是“朱利安日期”:

http://en.wikipedia.org/wiki/Ordinal_date

http://en.wikipedia.org/wiki/Julian_day

根据第一项,序数日期的ISO标准规定了4位数年份,范围从1到366,因此1月1日是1。

这当然意味着3月到12月之间的日期将有两个可能的值,具体取决于日期是否在闰年。

Bala的解决方案(在评论中给出+ 1选项)就足够了。

编辑:Jim Mischel指出,DateTime类型自己的DayOfYear属性更简单,可能更快。

答案 2 :(得分:2)

在c#中你可以做到

DateTime dt = DateTime.Now;
DateTime firstJan = new DateTime(dt.Year, 1, 1);

int daysSinceFirstJan = (dt - firstJan).Days + 1;

答案 3 :(得分:1)

我相信你要找的是:

DateTime dt = DateTime.Now;
string ordinalDate = dt.ToString("yy") + dt.DayOfYear.ToString("000");

这将为您提供一个字符串,该字符串始终为5位数,年份为两位数,每年包含3位数字。 Keveks的回答会给你一个可能是3,4或5位的字符串。