Có kiểu liệt kê được xác định trước cho Tháng trong thư viện .NET không?


97

Tôi đang tìm cách xem liệu có thống kê chính thức trong nhiều tháng trong khuôn khổ .net hay không.

Đối với tôi, có vẻ như có một kiểu, vì mức độ phổ biến của việc sử dụng tháng và bởi vì có những kiểu liệt kê khác như vậy trong khuôn khổ .net.

Ví dụ: có một bảng thống kê cho các ngày trong tuần, System.DayOfWeek, bao gồm thứ Hai, thứ Ba, v.v.

Tôi đang tự hỏi nếu có một cho các tháng trong năm, tức là tháng Giêng, tháng Hai, v.v.?

Có ai biết không?

Câu trả lời:


118

Không có, nhưng nếu bạn muốn tên của một tháng, bạn có thể sử dụng:

CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName (DateTime.Now.Month);

sẽ trả về một biểu diễn chuỗi (của tháng hiện tại, trong trường hợp này). Lưu ý rằng GetMonthcó các đối số từ 1 đến 13 - Tháng 1 là 1, 13 là một chuỗi trống.


11
Đó không phải là một enum mặc dù.
Scott Wisniewski

3
Cảm ơn, câu trả lời thú vị, không phải những gì tôi đang tìm kiếm, nhưng vẫn có giá trị +!
Mark Rogers

4
Tôi đồng ý về vấn đề văn hóa cụ thể, nhưng tại sao sau đó microsoft lại tạo ra DayOfWeek, đó là văn hóa cụ thể. Vui nhỉ?
Mark Rogers

12
Có lẽ vì các nền văn hóa khác nhau có lịch hàng tháng khác nhau, nhưng (dường như) không có một nền văn hóa nào có số ngày mỗi tuần khác nhau. Vì vậy, số ngày mỗi tuần là nhất quán ngay cả khi không có tên .
Ryan Lundy

11
Nếu bạn là một người, thời gian lập trình viên đi du lịch nhạy cảm về mặt văn hóa, ý thức được rằng đã có nền văn hóa đã có một tuần thập phân (ví dụ như cách mạng Pháp) en.wikipedia.org/wiki/Decimal_calendar
Matthew Khóa

75

Không, không có.


3
Về Microsoft.VisualBasic.MonthNamethì sao?
Josh Stodola

14
Thật là một câu trả lời hữu ích mà bạn đã cung cấp. Có lẽ một số hướng dẫn bổ sung sẽ thích hợp hơn.
Michael Eakins

13
@ guildlegr123 Làm thế nào bạn đề nghị tôi đi chứng minh một tiêu cực?
David Nelson,

7
Có lẽ nó không chứng minh được điều phủ định, nhưng một lý do nhỏ sẽ không sai: Không có enum vì enum không thể được bản địa hóa. Tháng Giêng sẽ chẳng có ý nghĩa gì đối với một lập trình viên người Nga. Điều này được hỗ trợ thêm bằng cách xem các hàm DO cung cấp tên tháng - chúng nằm trên đối tượng Văn hóa.
Sam Axe

8
Ủng hộ để chống lại 10 phiếu phản đối để có câu trả lời thực tế duy nhất cho câu hỏi này. Có một bảng kê chính thức cho các tháng trong .NET không? Không, không có. Nó sẽ không có ý nghĩa gì vì không phải lịch nào cũng có cùng số tháng và đó có thể là lý do tại sao nó chưa bao giờ được giới thiệu. Nhưng đó không phải là vấn đề ở đây. Có một cái? Không. Câu hỏi đã trả lời đúng.
sm

39

Tôi đang tìm cách xem liệu có thống kê chính thức trong nhiều tháng trong khuôn khổ .net hay không.

Không.

Đây là một cái tôi đã chuẩn bị trước đó. (Phiên bản C #)

public enum Month
{
    NotSet = 0,
    January = 1,
    February = 2,
    March = 3,
    April = 4,
    May = 5,
    June = 6,
    July = 7,
    August = 8,
    September = 9,
    October = 10,
    November = 11,
    December = 12
}

Tại sao sử dụng NotSet? Tại sao Không chỉ bắt đầu với January = 1? thì bạn cũng có thể làm
nốt

1
@Tersosauros vì sau đó nó sẽ mặc định là Januarynếu, ví dụ, nó được sử dụng làm thuộc tính cho một lớp. trong hầu hết các trường hợp, tôi không muốn điều đó, tôi muốn nó có giá trị 'null' trước khi được gán rõ ràng
wal

1
Nhưng @wal, nếu bạn muốn giá trị 'null', bạn nên sử dụng enum của bạn là nullable. Trong tháng sử dụng classe của bạn? Tháng {get; bộ; }.
cử hành

7
@Tersosauros lưu ý rằng 0 sẽ luôn là giá trị mặc định của một enum, ngay cả khi nó không được xác định rõ ràng. Nếu NotSetđược bỏ qua và January = 1(và phần còn lại của các giá trị là 2, 3, vv) thì mặc định của enum này sẽ là(Month)0
tsemer

đã đến để đăng điều tương tự .. đây sẽ là câu trả lời. Enum có thể được sử dụng chống lại tất cả các chức năng DateTime tức DateTime.Now.Month == (int) Month.January
Sonic linh hồn

32

DateTimeFormatInfo.CurrentInfo.MonthNames(không phải là enum, nhưng tôi nghĩ rằng phiên bản CurrentInfo của DateTimeFormatInfo là thứ bạn đang tìm kiếm nói chung). Nếu bạn muốn có một danh sách thả xuống, bạn có thể tạo nó như sau:

List<string> monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames.Take(12).ToList();
var monthSelectList = monthNames.Select(
   m => new { Id = monthNames.IndexOf(m) + 1, Name = m });

1
return Enumerable.Range (0, 11) .Select (m => new {Id = month + 1, Name = DateTimeFormatInfo.CurrentInfo.MonthNames [month]});
Keith Harrison

var months = Enumerable.Range(0, 11).Select(m => new KeyValuePair<int, string>(m + 1, DateTimeFormatInfo.CurrentInfo.MonthNames[m]));
Dan Diplo

13

Tìm thấy một trong enum "MonthNamesType" của vùng tên này: Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.Exchange2007

Vị trí hơi đáng sợ nhưng dù sao thì nó cũng ở đó.


Tôi sẽ cho bạn câu trả lời chính xác, nhưng tôi không nghĩ rằng đó là một phần của khung .net của thư viện cơ sở. +1 cho nỗ lực và sáng tạo.
Mark Rogers

có vẻ như nó là một phần của .net 3.5. Chỉ cần mở trình xem đối tượng trong Visual Studio và tìm kiếm "January" và các kết quả phù hợp trong API sẽ xuất hiện.
vidalsasoon

Vâng, tôi đã làm như bạn đề xuất, có vẻ như nó nằm trong thư mục v3.0 và nó không phải là một thư viện mặc định. Vì vậy, trong khi tôi đoán nó nằm trong thư viện, vị trí của nó không phải là lý tưởng. Nó nằm trong một vùng xám xa như yêu cầu của câu hỏi.
Mark Rogers

+1 chắc chắn sẽ dành cho nỗ lực. Chúng ta đang nói về dll gì ở đây?
indolentdeveloper

10

Chính xác thì bạn đang cố gắng hoàn thành điều gì?

nếu tất cả những gì bạn muốn là mười hai chuỗi với các tháng trong năm, thì điều đó có sẵn thông qua chuỗi định dạng tùy chỉnh - áp dụng cho bất kỳ trường hợp nào của ngày giờ,

  DateTime dt = DateTime.Parse("12 January 2009";
   dt.ToString("MMM");  // prints "Jan" 
                        // (or the right abbrev is in current culture)
   dt.ToString("MMMM"); // prints "January" 
                        // (or correct sp in current culture)

nếu bạn chỉ muốn có thể chỉ định tháng dưới dạng thuộc tính liệt kê của một số loại đối tượng khác, thì thuộc tính Tháng của trường DateTime trả về một số nguyên từ 1 đến 12 ...


1
Cảm ơn câu trả lời của bạn, tôi chỉ tò mò nếu có một bảng kê chính thức, bởi vì tôi sắp tạo một bảng liệt kê và tôi chỉ muốn biết liệu đã có một bảng liệt kê chưa, vì vậy tôi không xác định lại một bảng liệt kê không cần thiết .
Mark Rogers

1
Không afaik, chẳng có ai, (Nếu bạn tạo một, tôi sẽ làm cho các giá trị số nguyên rõ ràng, SOP bạn ensurethey có thể là giống như 1-12 giá trị sử dụng bởi Net để đại diện cho monthNumbers)
Charles Bretana

3

Vâng, chắc chắn là có. Nó là một phần của không gian tên Microsoft.VisualBasic ...

Microsoft.VisualBasic.MonthName

Và đối với những người bạn gặp vấn đề với không gian tên này, bạn nên hiểu rằng nó thực sự là .NET, và nó sẽ không đi đâu cả .

Đối với bản ghi, MonthNamehàm gọi nội bộ như sau ...

Thread.CurrentThread.CurrentCulture.DateTimeFormat.GetMonthName

1
Xin lỗi nhưng câu trả lời này có cùng một vấn đề với câu trả lời trước, ở chỗ nó không phải là một phép liệt kê, đó là chủ đề của câu hỏi này. Tuy nhiên, cảm ơn vì thông tin.
Mark Rogers

@Mark: System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames là một chuỗi [] là IEnumerable.
user169771

1
@ user169771 - string [] là một IEnumerablenhưng không phải là một thời hạn enum. Vì vậy, nó không hoạt động.
Mark Rogers

2

Một số lịch thực sự có hơn 12 tháng: http://en.wikipedia.org/wiki/Month nhưng tôi không thể nói đó có phải là lý do MS không xây dựng một enum trong .NET hay không.

Đối với những người lười biếng như tôi, những người sẽ thích một bản sao / dán, trong VB:

Public Enum MonthsOfYear
    January = 1
    February = 2
    March = 3
    April = 4
    May = 5
    June = 6
    July = 7
    August = 8
    September = 9
    October = 10
    November = 11
    December = 12
End Enum

1

Tôi không biết chắc, nhưng linh cảm của tôi là không. DateTime.Month trả về một số nguyên. Nếu có một bảng liệt kê như vậy, nó có thể sẽ được trả về bởi DateTime.


1

Tôi sẽ tìm kiếm thứ gì đó như thế này để viết mã, như

        if (DateTime.Now.Month != 1) // can't run this test in January.

có số 1 kỳ diệu này trong đó. trong khi

        if (DateTime.Now.Month != DateTime.MonthsOfYear.January) 

đang tự ghi lại


0

Một enum sẽ hữu ích hơn, nhưng bạn có thể nhận được kết quả mong muốn với định dạng:

DateTime myDateTimeObject=DateTime.Now; //(for example)
string monthName = myDateTimeObject.ToString("MMMM");

Điều này trả về tên tháng đầy đủ (tháng Giêng, tháng Hai, v.v.). Sử dụng myDateTimeObject.ToString("MMM")cho tên viết tắt (Jan, Feb, Mar, v.v.).

Nếu bạn có một số tháng cụ thể mnthNum, mà không có bất kỳ số nào DateTime, bạn luôn có thể sử dụng một cái gì đó như sau:

string monthName=(new DateTime(2000,mnthNum,1)).ToString("MMMM");

hoặc là

string monthName=((new DateTime(2000,1,1)).AddMonths(mnthNum-1)ToString("MMMM");

Nhưng điều đó có vẻ hơi lộn xộn. Ví dụ đầu tiên yêu cầu đó mnthNumlà từ 1 đến 12. Ví dụ thứ hai cho phép (gần như) bất kỳ số tháng nào và không bị giới hạn từ 1 đến 12.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.