Apakah ada pencacahan yang telah ditentukan untuk Bulan di perpustakaan .NET?

97

Saya ingin melihat apakah ada pencacahan resmi selama berbulan-bulan dalam kerangka .net.

Tampaknya mungkin bagi saya bahwa ada satu, karena seberapa umum penggunaan bulan, dan karena ada pencacahan lain dalam kerangka .net.

Misalnya, ada pencacahan untuk hari dalam seminggu, System.DayOfWeek, yang mencakup Senin, Selasa, dll.

Saya bertanya-tanya apakah ada yang untuk bulan-bulan dalam setahun, yaitu Januari, Februari, dll?

Apakah ada yang tahu?

Mark Rogers
sumber

Jawaban:

118

Tidak ada, tetapi jika Anda ingin nama bulan Anda dapat menggunakan:

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

yang akan mengembalikan representasi string (dari bulan saat ini, dalam kasus ini). Perhatikan bahwa GetMonthmengambil argumen dari 1 hingga 13 - Januari adalah 1, 13 adalah string kosong.

Andy Mikula
sumber
11
Tapi itu bukan enum.
Scott Wisniewski
3
Terima kasih, jawaban yang menarik, bukan yang saya cari, tetapi masih bernilai +!
Mark Rogers
4
Saya setuju tentang masalah budaya tertentu, tetapi mengapa Microsoft membuat DayOfWeek, itu khusus budaya. Lucu ya?
Mark Rogers
12
Mungkin karena berbagai budaya memiliki kalender bulanan yang berbeda, tetapi (ternyata) tidak ada satu pun yang memiliki jumlah hari yang berbeda dalam seminggu. Jadi jumlah hari dalam seminggu konsisten meskipun namanya tidak.
Ryan Lundy
11
Jika Anda adalah programmer perjalanan waktu yang peka budaya, ketahuilah bahwa ada budaya yang memiliki minggu desimal (misalnya Revolutionary Prancis) en.wikipedia.org/wiki/Decimal_calendar
Matthew Lock
75

Tidak, tidak ada.

David Nelson
sumber
3
Tentang apa Microsoft.VisualBasic.MonthName?
Josh Stodola
14
Sungguh jawaban yang berguna yang telah Anda berikan. Mungkin beberapa panduan tambahan lebih tepat.
Michael Eakins
13
@ guillegr123 Bagaimana saran Anda agar saya membuktikan hal negatif?
David Nelson
7
Mungkin itu tidak membuktikan negatif, tetapi sedikit alasan tidak akan rusak: Tidak ada enum karena enum tidak dapat dilokalkan. Months.Januari tidak akan banyak artinya bagi programmer Rusia. Hal ini selanjutnya didukung dengan melihat fungsi yang DO memberikan nama bulan - mereka berada di objek Budaya.
Sam Axe
8
Upvoting untuk menangkal 10 suara negatif untuk satu-satunya jawaban aktual atas pertanyaan ini. Apakah ada pencacahan resmi selama berbulan-bulan di .NET? Tidak, tidak ada. Ini tidak masuk akal karena tidak setiap kalender memiliki jumlah bulan yang sama, dan mungkin itulah sebabnya kalender ini tidak pernah diperkenalkan. Tapi bukan itu intinya di sini. Apakah ada? Tidak. Pertanyaan dijawab dengan benar.
sm
39

Saya ingin melihat apakah ada pencacahan resmi selama berbulan-bulan dalam kerangka .net.

Tidak.

Inilah yang saya siapkan sebelumnya. (Versi 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
}
wal
sumber
Mengapa digunakan NotSet? Mengapa Tidak Mulai Saja January = 1? maka Anda bisa menyingkirkan tugas lainnya juga ..
Tersosauros
1
@Tersosauros karena akan menjadi default Januaryjika, misalnya, digunakan sebagai properti untuk kelas. dalam banyak kasus saya tidak menginginkannya, saya ingin memiliki nilai 'null' sebelum secara eksplisit ditetapkan
wal
1
Tapi @wal, jika Anda menginginkan nilai 'null', Anda harus menggunakan enum Anda sebagai nullable. Di kelas Anda, gunakan Bulan publik? Bulan {get; set; }.
oteal
7
@Tersosauros perhatikan bahwa 0 akan selalu menjadi nilai default enum, meskipun tidak ditentukan secara eksplisit. Jika NotSetdihilangkan dan January = 1(dan nilai lainnya adalah 2, 3, dll.) Maka default enum ini adalah(Month)0
tsemer
datang untuk memposting hal yang sama .. ini harus menjadi jawabannya. Enum dapat digunakan untuk semua fungsi DateTime yaitu DateTime.Now.Month == (int) Month.January
Sonic Soul
32

DateTimeFormatInfo.CurrentInfo.MonthNames(bukan enum, tapi menurut saya contoh CurrentInfo DateTimeFormatInfo adalah apa yang Anda cari secara umum). Jika Anda menginginkan daftar drop-down, Anda dapat membuatnya seperti ini:

List<string> monthNames = DateTimeFormatInfo.CurrentInfo.MonthNames.Take(12).ToList();
var monthSelectList = monthNames.Select(
   m => new { Id = monthNames.IndexOf(m) + 1, Name = m });
Doug Lampe
sumber
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

Ditemukan satu di enum "MonthNamesType" namespace ini: Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.Exchange2007

Lokasinya agak menakutkan tapi tetap ada di sana.

vidalsasoon
sumber
Saya akan memberi Anda jawaban yang benar, tetapi saya tidak berpikir itu adalah bagian dari kerangka dasar perpustakaan .net. 1 untuk usaha dan kreativitas.
Mark Rogers
sepertinya itu bagian dari .net 3.5. Buka saja penampil objek di Visual Studio dan cari "Januari" dan kecocokan di API muncul.
vidalsasoon
Ya, saya melakukan seperti yang Anda sarankan, sepertinya ada di folder v3.0, dan ini bukan library default. Jadi meskipun saya kira itu ada di perpustakaan, lokasinya kurang dari ideal. Itu di area abu-abu sejauh persyaratan pertanyaan.
Mark Rogers
+1 pasti untuk usaha. Dll apa yang kita bicarakan di sini?
pengembang lamban
10

Apa sebenarnya yang ingin Anda capai?

jika yang Anda inginkan hanyalah dua belas string dengan bulan dalam tahun yang dijabarkan, maka itu tersedia melalui string format kustom - diterapkan untuk setiap contoh datetime,

  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)

jika Anda hanya ingin dapat menentukan bulan sebagai properti enumerasi dari beberapa tipe objek lain, maka properti Bulan dari bidang DateTime mengembalikan integer dari 1 hingga 12 ...

Charles Bretana
sumber
1
Terima kasih atas jawaban Anda, saya hanya ingin tahu apakah ada pencacahan resmi, karena saya akan membuatnya dan saya hanya ingin tahu apakah ada yang sudah ada, jadi saya tidak mendefinisikan ulang pencacahan yang tidak diperlukan .
Mark Rogers
1
Tidak afaik, tidak ada, (Jika Anda membuat satu, saya akan membuat nilai integer eksplisit, sop Anda dapat memastikan mereka sama dengan nilai 1-12 yang digunakan oleh .Net untuk mewakili monthNumbers)
Charles Bretana
3

Ya, pasti ada. Itu adalah bagian dari namespace Microsoft.VisualBasic ...

Microsoft.VisualBasic.MonthName

Dan bagi Anda yang memiliki masalah dengan namespace ini, Anda harus memahami bahwa itu benar-benar .NET, dan itu tidak akan berhasil .

Sebagai catatan, MonthNamefungsi secara internal memanggil yang berikut ...

Thread.CurrentThread.CurrentCulture.DateTimeFormat.GetMonthName
Josh Stodola
sumber
1
Maaf tapi jawaban ini memiliki masalah yang sama dengan jawaban sebelumnya, yaitu bukan pencacahan, yang merupakan topik pertanyaan ini. Tetap saja, terima kasih atas infonya.
Mark Rogers
@Mark: System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames adalah string [] yang merupakan IEnumerable.
pengguna169771
1
@ user169771 - string [] adalah IEnumerabletetapi bukan enumerasi. Jadi tidak berhasil.
Mark Rogers
2

Beberapa kalender memang memiliki lebih dari 12 bulan: http://en.wikipedia.org/wiki/Month tetapi saya tidak dapat mengatakan apakah itu alasan MS tidak membuat enum di .NET.

Untuk yang malas seperti saya yang ingin di copy / paste, di 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
Francois Gagnon
sumber
1

Saya tidak tahu pasti, tapi firasat saya tidak. DateTime.Month mengembalikan integer. Jika ada pencacahan seperti itu, mungkin akan dikembalikan oleh DateTime.

Scott Wisniewski
sumber
1

Saya akan mencari sesuatu seperti ini untuk dikodekan, sebagai

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

memiliki angka ajaib 1 di dalamnya. sedangkan

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

mendokumentasikan diri sendiri

Jadawin
sumber
0

Enum akan lebih berguna, tetapi Anda bisa mendapatkan hasil yang diinginkan dengan format:

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

Ini mengembalikan nama bulan penuh (Januari, Februari, dll.). Gunakan myDateTimeObject.ToString("MMM")untuk nama pendek (Jan, Feb, Mar, dll.).

Jika Anda memiliki nomor bulan tertentu mnthNum, tanpa nomor DateTime, Anda selalu dapat menggunakan sesuatu seperti ini:

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

atau

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

Tapi sepertinya agak berantakan. Contoh pertama mensyaratkan mnthNumantara 1 dan 12. Contoh kedua memungkinkan untuk (hampir) nomor bulan apa pun dan tidak terbatas pada 1 hingga 12.

keith
sumber