ZetCode

C# 日历

最后修改于 2023 年 7 月 5 日

在本文中,我们将展示如何在 C# 中使用日历。

DateTime 表示时间中的一个瞬间。 datetime 的字符串表示形式是特定于区域性的,并且取决于用于显示日期和时间的约定及其日历。日历是一种组织 datetime 单位的系统。

CultureInfo 提供有关特定区域性的信息。 这些信息包括区域性的名称、书写系统、使用的日历、字符串的排序顺序以及日期和数字的格式。 GregorianCalendar 是最流行的日历,并用作独立于区域性的选项的默认日历。

每个 CultureInfo 都支持一组日历。 Calendar 返回区域性的默认日历。 OptionalCalendars 提供一个数组,其中包含该区域性支持的所有日历。

.NET 支持多种日历,包括 GregorianCalendar、HebrewCalendar、HijriCalendar、JapaneseCalendar、JulianCalendar 或 PersianCalendar。

.NET 日历类型位于 System.Globalization 命名空间中。

C# 默认日历

每种文化都有一个默认日历。 例如,斯洛伐克、匈牙利和俄罗斯使用 GregorianCalendar。 有些文化可以选择其他日历。 波斯文化使用 PersianCalendar 作为默认日历,并将 GregorianCalendar 和 HijriCalendar 作为可选日历。

Program.cs
using System.Globalization;

Console.WriteLine(CultureInfo.InvariantCulture.Calendar);
Console.OutputEncoding = System.Text.Encoding.UTF8;

string[] culs = { "sk-SK", "he-IL", "hi-IN", "fa-IR" };

foreach (var cul in culs)
{
    DateTime now = DateTime.Now;
    var ci = new CultureInfo(cul);

    Console.WriteLine($"{now.ToString("F", ci)}");

    Console.WriteLine(ci.Calendar);
    Console.WriteLine("==========");

    foreach (var oc in ci.OptionalCalendars)
    {
        Console.WriteLine(oc);
    }

    Console.WriteLine("--------------------------------");
}

该示例打印了几个文化的默认日历和可选日历。

Console.WriteLine(CultureInfo.InvariantCulture.Calendar);

我们打印 InvariantCulture 的默认日历。

string[] culs = { "sk-SK", "he-IL", "hi-IN", "fa-IR" };

我们选择四种不同的文化:斯洛伐克语、希伯来语、印地语和波斯语。

DateTime now = DateTime.Now;
var ci = new CultureInfo(cul);

Console.WriteLine($"{now.ToString("F", ci)}");

我们定义 CultureInfo 并在这种文化中显示当前的 datetime。

Console.WriteLine(ci.Calendar);

我们打印该文化的默认日历。

foreach (var oc in ci.OptionalCalendars)
{
    Console.WriteLine(oc);
}

如果有的话,我们打印可选日历。

$ dotnet run
System.Globalization.GregorianCalendar
streda 5. júla 2023 15:02:02
System.Globalization.GregorianCalendar
==========
System.Globalization.GregorianCalendar
--------------------------------
יום רביעי, 5 ביולי 2023 15:02:02
System.Globalization.GregorianCalendar
==========
System.Globalization.GregorianCalendar
System.Globalization.HebrewCalendar
System.Globalization.HijriCalendar
--------------------------------
बुधवार, 5 जुलाई 2023 3:02:02 pm
System.Globalization.GregorianCalendar
==========
System.Globalization.GregorianCalendar
--------------------------------
1402 تیر 14, چهارشنبه 15:02:02
System.Globalization.PersianCalendar
==========
System.Globalization.PersianCalendar
System.Globalization.GregorianCalendar
System.Globalization.HijriCalendar
--------------------------------

C# HebrewCalendar

HebrewCalendar 代表希伯来日历。

Program.cs
using System.Globalization;

Console.OutputEncoding = System.Text.Encoding.UTF8;

var hc = new HebrewCalendar();
var d1 = new DateTime(5776, 10, 7, hc);

Console.WriteLine($"{d1:d}");
Console.WriteLine($"{hc.GetYear(d1)}/{hc.GetMonth(d1)}/{hc.GetDayOfMonth(d1)}");

在此示例中,我们定义了希伯来日历中的一个 datetime,并以 Gregorian 和 Hebrew 字符串表示形式打印它。

var hc = new HebrewCalendar();
var d1 = new DateTime(5776, 10, 7, hc);

日历作为 DateTime 构造函数的第四个参数传递。

$ dotnet run
6/13/2016
5776/10/7

在下一个示例中,我们打印希伯来文化中允许的所有三个日历中的 datetime。

Program.cs
using System.Globalization;

Console.OutputEncoding = System.Text.Encoding.UTF8;
CultureInfo heCul = CultureInfo.CreateSpecificCulture("he-IL"); 

var now = DateTime.Today;

heCul.DateTimeFormat.Calendar = new GregorianCalendar(); 
Console.WriteLine(now.ToString("D", heCul));

heCul.DateTimeFormat.Calendar = new HebrewCalendar(); 
Console.WriteLine(now.ToString("D", heCul));

heCul.DateTimeFormat.Calendar = new HijriCalendar(); 
Console.WriteLine(now.ToString("D", heCul));

我们在 Gregorian、Hebrew 和 Hijri 日历中打印今天的希伯来日期。

$ dotnet run
יום רביעי, 5 ביולי 2023
יום רביעי, ט"ז בתמוז תשפ"ג
יום רביעי, 17 בד׳ו אל־חיג׳ה 1444

比较日期

在下一个示例中,我们比较三种不同文化中的日期。

Program.cs
using System.Globalization;

var skCul = new CultureInfo("sk-SK");
var saCul = new CultureInfo("ar-SA");
var faCul = new CultureInfo("fa-IR");

var hc = new HijriCalendar();
var pc = new PersianCalendar();

var now = DateTime.Now;
var tom = now.AddDays(1);

var skd = new DateTime(now.Year, now.Month, now.Day, skCul.Calendar);
var sad = new DateTime(hc.GetYear(tom), hc.GetMonth(tom), hc.GetDayOfMonth(tom), saCul.Calendar);
var fad = new DateTime(pc.GetYear(now), pc.GetMonth(now), pc.GetDayOfMonth(now), faCul.Calendar);

Console.WriteLine(skd == fad);
Console.WriteLine(skd > sad);

在此示例中,我们定义了斯洛伐克语、阿拉伯语和波斯语文化。 我们比较其默认日历中的 datetime 值。

var skCul = new CultureInfo("sk-SK");
var saCul = new CultureInfo("ar-SA");
var faCul = new CultureInfo("fa-IR");

定义了斯洛伐克语、阿拉伯语和波斯语 CultureInfo 对象。

var hc = new HijriCalendar();
var pc = new PersianCalendar();

我们为阿拉伯文化定义一个 HijriCalendar,为波斯/法尔西文化定义一个 PersianCalendar。 斯洛伐克文化使用 GregorianCalendar

var now = DateTime.Now;
var tom = now.AddDays(1);

我们定义了两个日期。 这些值在 GregorianCalendar 中。

var skd = new DateTime(now.Year, now.Month, now.Day, skCul.Calendar);
var sad = new DateTime(hc.GetYear(tom), hc.GetMonth(tom), hc.GetDayOfMonth(tom), saCul.Calendar);
var fad = new DateTime(pc.GetYear(now), pc.GetMonth(now), pc.GetDayOfMonth(now), faCul.Calendar);

我们在三种不同的日历中创建三个 DateTime 值。 我们使用 GetYearGetMonthGetDayOfMonth 方法来获取指定日历的适当值。

Console.WriteLine(skd == fad);
Console.WriteLine(skd > sad);

我们使用算术运算符比较 datetime 值。

$ dotnet run
True
False

来源

日历类 - 语言参考

在本文中,我们使用了 C# 中的日历。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直撰写编程文章。 迄今为止,我撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程