2011-09-30 497 views
6

需要Excel和Excel中的公式將「yyyymmdd」格式的數據轉換爲朱利安日期格式「yyJJJ」? 「JJJ」是Julian提交日期。 JJJ是1到365還是999或366的數字?我不認爲它的366,但我們確實有閏年,所以它可能是閏年。將日期yyyymmdd轉換爲yyJJJ或Julian日期

在Excel中,我嘗試使用以下內容:

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

在C#我現在使用()來獲得當前的日期。但我想要的是1月1日至當前日期之間的天數。不知道這是正確的原型公式:

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

在.NET中,「DateTime.DayOfYear」工作得很好。對於Excel,請參閱http://www.cpearson.com/excel/jdates.htm –

回答

11

,而不是在C#中處理這個你自己,你可以簡單地使用JulianCalendar class

而獲得在今天的儒略曆,你可以這樣做:

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教育了我一個位在下方的評論,並指出,你不是在羅馬儒略曆,這是上面的代碼將在對於JulianCalendar給今天尋找類。相反,它看起來你正在尋找序數日期(這件作品添加爲未來的讀者澄清)。我將要離開上述,以免有人犯同樣的錯誤。你真正想要的,我相信,什麼是第一次編輯,但沒有JulianCalendar業務的代碼,所以:

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

這樣簡單的答案,但也是這樣的一個真相! ;-) – Tipx

+0

-1。這根本不是OP正在尋找的東西,事實上,這是不正確的。對於2011-09-30,示例中的dateInJulian變量的值爲2011-10-13。但根據海報的要求,正確的結果是11273(因爲273是2011-09-30的DayOfYear)。 – phoog

+1

@phoog對不起,我很確定你不知道你在說什麼。 273是格里曆歷年的那一天,朱利安歷年的那一天實際上是286.這個可能是OP要找的是Julian日,在這種情況下你是對的,而上面的是不正確的,但是,他的問題表明Julian約會對我來說意味着日曆。再次閱讀這個問題,或許你是對的,那就是他正在尋找的東西,即使代碼沒有錯誤,並且可以很容易地用來找到你在說什麼,如果用'today'代替'dateInJulian'。 – Kevek

1

在C#中,你可以做

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

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

謝謝巴拉。快速提問:01/01/2011 JJJ = 001,還是000?並且是09/30/2011 JJJ = 269或270? thx – RetroCoder

+1

@RetroCoder我不知道朱連日曆。現在上面的片段將在1月1日返回0。如果它必須打開,只需做'(dt - firstJan).Days + 1;' –

+0

我喜歡這個邏輯並且使用它我自己! –

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選項)就足夠了。

編輯:DateTime類型的自己的DayOfYear屬性,正如Jim Mischel指出的,更簡單並且可能更快。

+0

我必須使用兩位數的年份格式b/c作爲狀態規範的一部分。 – RetroCoder

+1

夠公平的。然後,我會檢查規範的來源,看他們是否喜歡在1月份使用'1'或'0'。如果這不可能或不可告人,我會使用'1'。 – phoog

1

我相信你正在尋找的是這樣的:

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

這會給你一個字符串,它始終是5位數字以兩位數年3位數日的一年。 凱維克答案會給你一個字符串,可能是3,4或5位數字。