2011-09-30 104 views
6

Cần một công thức trong excel và C# để chuyển đổi dữ liệu ở định dạng "yyyymmdd" sang định dạng ngày tháng julian "yyJJJ"? Nơi "JJJ" là ngày Julian được gửi. JJJ có phải là số từ 1 đến 365 hoặc 999 hay 366 không? Tôi không nghĩ rằng nó 366, nhưng chúng tôi có năm nhuận để nó có thể là năm nhuận.ngày chuyển đổi yyyymmdd thành yyJJJ hoặc Julian Date

Trong Excel Tôi đang cố gắng để sử dụng như sau:

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

Trong C# Tôi đang sử dụng bây giờ() để có được ngày hiện tại. Nhưng tôi muốn số ngày giữa ngày 1 tháng 1 và ngày hiện tại. Bạn không chắc chắn nếu điều này là công thức nguyên mẫu chính xác:

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

Trong .NET, 'DateTime.DayOfYear' hoạt động khá tốt. Đối với Excel, xem http://www.cpearson.com/excel/jdates.htm –

Trả lời

11

Thay vì xử lý này cho mình trong C#, bạn chỉ có thể sử dụng JulianCalendar class

Và để có được hôm nay trong lịch Julian, bạn có thể làm:

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); 

EDIT:

Và tôi nhận ra rằng tôi không giúp bạn một cách tốt để có được một kết quả theo định dạng YYJJJ bạn đang tìm kiếm, nó khá đơn giản:

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

Đáng buồn thay, tôi không nghĩ rằng có một tương đương với dateTime.ToString("JJJ"); sẽ cung cấp cho ngày trong năm, do đó ít hoạt động của tôi string.Format(), nhưng nó cũng hoạt động tốt!

EDIT2:

Vì vậy Phoog đào tạo cho tôi một chút bên dưới trong các ý kiến, và chỉ ra rằng bạn đã không tìm kiếm ngày hôm nay trong lịch Julian, đó là những gì các mã trên sẽ nhượng bộ đối với các JulianCalendar lớp học. Thay vào đó, nó xuất hiện bạn đang tìm kiếm ngày Ordinal (phần này được thêm vào để làm rõ người đọc trong tương lai). Tôi sẽ rời khỏi phần trên để ai đó không phạm phải sai lầm tương tự như tôi đã làm. Những gì bạn thực sự muốn, tôi tin rằng, là mã từ chỉnh sửa đầu tiên nhưng không có công việc kinh doanh JulianCalendar, vì vậy:

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

Câu trả lời đơn giản như vậy, nhưng cũng là một sự thật! ;-) – Tipx

+0

-1. Đây không phải là tất cả những gì OP đang tìm kiếm, và trên thực tế, nó không chính xác. Trong giai đoạn 2011-09-30, biến dateInJulian trong ví dụ sẽ có giá trị 2011-10-13. Nhưng kết quả chính xác, theo yêu cầu của người đăng, là 11273 (kể từ 273 là 'DayOfYear' cho 2011-09-30). – phoog

+1

@phoog Xin lỗi, tôi chắc chắn bạn không biết bạn đang nói về điều gì. 273 là ngày của năm Lịch Gregorian, và ngày của năm Lịch Julian là thực tế 286. Có thể những gì OP tìm kiếm là ngày Julian, trong trường hợp đó bạn đúng và ở trên là không chính xác nhưng câu hỏi của anh ta nói ngày Julian ngụ ý lịch cho tôi. Đọc câu hỏi một lần nữa, có lẽ bạn đúng và đó là những gì anh ta đang tìm kiếm, ngay cả như vậy mã không chính xác và có thể dễ dàng được sử dụng để tìm thấy những gì bạn đang nói về, nếu bạn thay thế 'ngày hôm nay 'cho' dateInJulian'. – Kevek

1

trong C# bạn có thể làm

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

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

Cảm ơn Bala. Câu hỏi nhanh: 01/01/2011 JJJ = 001, hay 000? Và là 30/30/2011 JJJ = 269 hay 270? thx – RetroCoder

+1

@RetroCoder Tôi không biết lịch julian. Ngay bây giờ đoạn mã trên sẽ trả về 0 cho tháng 1. nếu nó có được trên, chỉ cần làm '(dt - firstJan) .Days + 1;' –

+0

Tôi yêu logic này và sử dụng bản thân mình! –

5

Theo những bài viết này, bạn nên sử dụng thuật ngữ "TT ngày" chứ không phải "ngày Julian ":

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

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

Theo người đầu tiên, tiêu chuẩn ISO cho ngày thứ chỉ định một năm 4 chữ số, và rằng phạm vi là 1-366, vì vậy 1 tháng 1 là 1.

Điều này tất nhiên có nghĩa là các ngày từ tháng 3 đến tháng 12 sẽ có hai giá trị có thể tùy thuộc vào việc ngày đó có nằm trong năm nhuận hay không.

Giải pháp của Bala (với tùy chọn + 1 được đưa ra trong nhận xét) do đó sẽ đủ.

CHỈNH SỬA: DateTime thuộc tính DayOfYear của riêng loại, như Jim Mischel đã chỉ ra, đơn giản hơn và có thể nhanh hơn.

+0

Tôi phải sử dụng định dạng năm hai chữ số b/c phần của thông số trạng thái. – RetroCoder

+1

Đủ công bằng. Sau đó tôi sẽ kiểm tra với nguồn gốc của đặc điểm kỹ thuật để xem liệu họ có muốn sử dụng '1' hoặc' 0' cho ngày đầu tiên của tháng 1 hay không. Nếu điều đó là không thể hoặc được khuyến khích, tôi sẽ sử dụng '1'. – phoog

1

Tôi tin rằng những gì bạn đang tìm kiếm là thế này:

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

này sẽ cung cấp cho bạn một chuỗi luôn luôn là 5 chữ số với một ngày hai năm chữ số và 3 chữ số của năm. Câu trả lời của Keveks sẽ cho bạn một chuỗi có thể là 3, 4 hoặc 5 chữ số.

Các vấn đề liên quan