มีการแจงนับที่กำหนดไว้ล่วงหน้าสำหรับเดือนในไลบรารี. NET หรือไม่


100

ฉันต้องการดูว่ามีการแจงนับอย่างเป็นทางการเป็นเวลาหลายเดือนใน. net framework หรือไม่

สำหรับฉันแล้วดูเหมือนจะเป็นไปได้ว่ามีอยู่เนื่องจากการใช้งานเดือนเป็นเรื่องปกติและเนื่องจากมีการแจงนับอื่น ๆ ใน. net

ตัวอย่างเช่นมีการแจงนับสำหรับวันในสัปดาห์ System.DayOfWeek ซึ่งรวมถึงวันจันทร์วันอังคารเป็นต้น

ฉันสงสัยว่ามีเดือนในหนึ่งปีเช่นมกราคมกุมภาพันธ์เป็นต้น?

มีใครรู้บ้าง?

คำตอบ:


119

ไม่มี แต่ถ้าคุณต้องการชื่อของเดือนคุณสามารถใช้:

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

ซึ่งจะส่งกลับการแสดงสตริง (ของเดือนปัจจุบันในกรณีนี้) สังเกตว่าGetMonthอาร์กิวเมนต์ตั้งแต่ 1 ถึง 13 - มกราคมคือ 1, 13 เป็นสตริงว่าง


11
นั่นไม่ใช่ enum แม้ว่า
Scott Wisniewski

3
ขอบคุณคำตอบที่น่าสนใจไม่ใช่สิ่งที่ฉันกำลังมองหา แต่ก็ยังคุ้มค่า +!
Mark Rogers

4
ฉันเห็นด้วยเกี่ยวกับปัญหาเฉพาะของวัฒนธรรม แต่ทำไมไมโครซอฟท์จึงสร้าง DayOfWeek ซึ่งเป็นเรื่องเฉพาะวัฒนธรรม ตลกเหรอ?
Mark Rogers

12
อาจเป็นเพราะวัฒนธรรมต่างๆมีปฏิทินรายเดือนที่แตกต่างกัน แต่ไม่มีปฏิทินใดที่มีจำนวนวันต่อสัปดาห์ต่างกัน ดังนั้นจำนวนวันต่อสัปดาห์จึงสม่ำเสมอแม้ว่าชื่อจะไม่ตรงกันก็ตาม
Ryan Lundy

11
หากคุณเป็นโปรแกรมเมอร์ที่มีความอ่อนไหวทางวัฒนธรรมและมีความละเอียดอ่อนในการเดินทางข้ามเวลาโปรดทราบว่ามีวัฒนธรรมที่มีสัปดาห์ทศนิยม (เช่น Revolutionary France) en.wikipedia.org/wiki/Decimal_calendar
Matthew Lock

76

ไม่มีไม่มี


3
เกี่ยวกับอะไรMicrosoft.VisualBasic.MonthName?
Josh Stodola

14
คำตอบที่เป็นประโยชน์ที่คุณให้ไว้ บางทีคำแนะนำเพิ่มเติมบางอย่างอาจเหมาะสมกว่า
Michael Eakins

13
@ guillegr123 คุณจะแนะนำให้ฉันไปพิสูจน์แง่ลบได้อย่างไร?
David Nelson

7
บางทีมันอาจไม่ได้พิสูจน์ในแง่ลบ แต่การใช้เหตุผลเพียงเล็กน้อยก็ไม่ผิดปกติ: ไม่มี enum เพราะ enums ไม่สามารถแปลเป็นภาษาท้องถิ่นได้ เดือนมกราคมจะมีความหมายเพียงเล็กน้อยสำหรับโปรแกรมเมอร์ชาวรัสเซีย สิ่งนี้ได้รับการสนับสนุนเพิ่มเติมโดยดูที่ฟังก์ชั่นที่ระบุชื่อเดือนซึ่งตั้งอยู่บนวัตถุวัฒนธรรม
Sam Axe

8
การโหวตเพื่อต่อต้านการโหวตลดลง 10 รายการสำหรับคำตอบที่แท้จริงเพียงข้อเดียวสำหรับคำถามนี้ NET มีการแจกแจงอย่างเป็นทางการสำหรับเดือนใน. NET หรือไม่? ไม่มีไม่มี มันจะไม่ค่อยสมเหตุสมผลเพราะไม่ใช่ทุกปฏิทินที่มีจำนวนเดือนเท่ากันและนั่นอาจเป็นเหตุผลว่าทำไมจึงไม่เคยมีการเปิดตัว แต่นั่นไม่ใช่ประเด็นที่นี่ มีหรือเปล่า ไม่ใช่คำถามตอบถูก
sm

40

ฉันต้องการดูว่ามีการแจงนับอย่างเป็นทางการเป็นเวลาหลายเดือนใน. net framework หรือไม่

ไม่

นี่คือสิ่งที่ฉันเตรียมไว้ก่อนหน้านี้ (เวอร์ชัน 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
}

ทำไมต้องใช้NotSet? ทำไมไม่เพิ่งเริ่มด้วยJanuary = 1? แล้วคุณก็จัดการงานที่เหลือได้ด้วย ..
Tersosauros

1
@Tersosauros เพราะค่าเริ่มต้นจะเป็นJanuaryif ตัวอย่างเช่นใช้เป็นคุณสมบัติของคลาส ในกรณีส่วนใหญ่ฉันไม่ต้องการสิ่งนั้นฉันต้องการให้มีค่า 'null' ก่อนที่จะกำหนดอย่างชัดเจน
wal

1
แต่ @wal ถ้าคุณต้องการค่า 'null' คุณควรใช้ enum ของคุณเป็นค่าว่าง ใน classe ของคุณใช้เดือนสาธารณะ? เดือน {รับ; ชุด; }.
oteal

7
@Tersosauros โปรดทราบว่า 0 จะเป็นค่าเริ่มต้นของ enum เสมอแม้ว่าจะไม่ได้กำหนดไว้อย่างชัดเจนก็ตาม ถ้าNotSetถูกละไว้และJanuary = 1(และค่าที่เหลือคือ 2, 3 เป็นต้น) ค่าเริ่มต้นของ enum นี้จะเป็น(Month)0
tsemer

มาโพสต์เหมือนกัน.. นี่น่าจะเป็นคำตอบ. Enum สามารถใช้กับฟังก์ชัน DateTime ทั้งหมดเช่น DateTime.Now.Month == (int) Month มกราคม
Sonic Soul

32

DateTimeFormatInfo.CurrentInfo.MonthNames(ไม่ใช่ enum แต่ฉันคิดว่าอินสแตนซ์ CurrentInfo ของ DateTimeFormatInfo คือสิ่งที่คุณกำลังมองหาโดยทั่วไป) หากคุณต้องการรายการแบบเลื่อนลงคุณสามารถสร้างได้ดังนี้:

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) เลือก (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

พบหนึ่งใน enum "MonthNamesType" ของเนมสเปซนี้: Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.Exchange2007

สถานที่ตั้งค่อนข้างน่ากลัว แต่ก็มี


ฉันจะให้คำตอบที่ถูกต้องแก่คุณ แต่ฉันไม่คิดว่านั่นเป็นส่วนหนึ่งของกรอบงาน. net +1 สำหรับความพยายามและความคิดสร้างสรรค์
Mark Rogers

ดูเหมือนว่าเป็นส่วนหนึ่งของ. net 3.5 เพียงแค่เปิดโปรแกรมดูวัตถุใน Visual Studio แล้วค้นหาคำว่า "มกราคม" จากนั้นรายการที่ตรงกันใน API จะปรากฏขึ้น
vidalsasoon

ใช่ฉันทำตามที่คุณแนะนำดูเหมือนว่าอยู่ในโฟลเดอร์ v3.0 และไม่ใช่ไลบรารีเริ่มต้น ดังนั้นฉันเดาว่ามันอยู่ในห้องสมุด แต่ตำแหน่งที่ตั้งก็ไม่เหมาะ มันอยู่ในพื้นที่สีเทาซึ่งเป็นไปตามข้อกำหนดของคำถาม
Mark Rogers

+1 จะเป็นความพยายามอย่างแน่นอน เรากำลังพูดถึง dll อะไรที่นี่?
indolentdeveloper

10

คุณพยายามทำอะไรให้สำเร็จ?

หากสิ่งที่คุณต้องการคือสิบสองสตริงที่มีการสะกดเดือนของปีสิ่งนั้นจะพร้อมใช้งานผ่านสตริงรูปแบบที่กำหนดเอง - ใช้กับอินสแตนซ์ของวันที่และเวลาใด ๆ

  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)

หากคุณต้องการเพียงแค่สามารถระบุเดือนเป็นคุณสมบัติที่แจกแจงของประเภทวัตถุอื่น ๆ คุณสมบัติ Month ของฟิลด์ DateTime จะส่งกลับจำนวนเต็มตั้งแต่ 1 ถึง 12 ...


1
ขอบคุณสำหรับคำตอบฉันแค่อยากรู้ว่ามีการแจงนับอย่างเป็นทางการหรือไม่เพราะฉันกำลังจะสร้างขึ้นมาและฉันแค่อยากรู้ว่ามีคำตอบที่มีอยู่แล้วหรือไม่ดังนั้นฉันจึงไม่ได้กำหนดการแจงนับใหม่ที่ไม่จำเป็น .
Mark Rogers

1
ไม่มี afaik ไม่มีเลย (ถ้าคุณสร้างขึ้นมาฉันจะทำให้ค่าจำนวนเต็มชัดเจนคุณสามารถมั่นใจได้ว่าพวกเขาจะเหมือนกับค่า 1-12 ที่ใช้โดย. Net เพื่อแทน monthNumbers)
Charles Bretana

3

ใช่มีแน่นอน เป็นส่วนหนึ่งของเนมสเปซ Microsoft.VisualBasic ...

Microsoft.VisualBasic.MonthName

และสำหรับผู้ที่มีปัญหากับ namespace นี้คุณควรจะเข้าใจว่ามันอย่างแท้จริงคือ .NET และมันจะไม่ไปไหนทั้งนั้น

สำหรับเร็กคอร์ดMonthNameฟังก์ชันภายในจะเรียกสิ่งต่อไปนี้ ...

Thread.CurrentThread.CurrentCulture.DateTimeFormat.GetMonthName

1
ขออภัยคำตอบนี้มีปัญหาเช่นเดียวกับคำตอบก่อนหน้าซึ่งไม่ใช่การแจงนับซึ่งเป็นหัวข้อของคำถามนี้ ยังคงขอบคุณสำหรับข้อมูล
Mark Rogers

@Mark: System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames เป็นสตริง [] ซึ่ง IEnumerable
user169771

1
@ user169771 - string [] เป็นIEnumerableแต่ไม่ใช่enumeration มันก็เลยไม่ได้ผล
Mark Rogers

2

ปฏิทินบางคนมีเวลามากกว่า 12 เดือน: http://en.wikipedia.org/wiki/Monthแต่ฉันไม่สามารถบอกได้ว่าเป็นสาเหตุที่ MS ไม่ได้สร้าง enum ใน. NET หรือไม่

สำหรับคนขี้เกียจอย่างฉันที่ชอบคัดลอก / วางใน 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

ฉันไม่รู้แน่ชัด แต่ลางสังหรณ์ของฉันคือไม่ DateTime.Month ส่งกลับจำนวนเต็ม หากมีการแจงนับดังกล่าวอาจส่งคืนโดย DateTime


1

ฉันกำลังมองหาบางอย่างเช่นนี้เพื่อเขียนโค้ดด้วย

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

มีเวทมนตร์นี้เป็น 1 ในนั้น ในขณะที่

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

เป็นเอกสารด้วยตนเอง


0

enum ค่อนข้างมีประโยชน์ แต่คุณจะได้ผลลัพธ์ที่ต้องการด้วยรูปแบบ:

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

ซึ่งจะส่งคืนชื่อเต็มเดือน (มกราคมกุมภาพันธ์ ฯลฯ ) ใช้myDateTimeObject.ToString("MMM")สำหรับชื่อย่อ (ม.ค. ก.พ. มี.ค. ฯลฯ )

หากคุณมีหมายเลขเดือนmnthNumใด ๆDateTimeคุณสามารถใช้สิ่งนี้ได้ตลอดเวลา:

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

หรือ

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

แต่ดูเหมือนจะยุ่งเล็กน้อย ตัวอย่างแรกกำหนดให้mnthNumอยู่ระหว่าง 1 ถึง 12 ตัวอย่างที่สองอนุญาตให้ใช้ตัวเลข (เกือบ) เดือนใดก็ได้และไม่ จำกัด ไว้ที่ 1 ถึง 12

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.