【问题标题】:Convert between calendars在日历之间转换
【发布时间】:2023-03-03 09:25:21
【问题描述】:

如何在日历之间转换?这是我所拥有的:

UmAlQuraCalendar hijri = new UmAlQuraCalendar();
GregorianCalendar cal = new GregorianCalendar();

DateTime hijriDate = new DateTime(1434, 11, 23, hijri);
DateTime gregorianDate = ...; //

我需要一个与hijriDate 对应的gregorianDate

【问题讨论】:

标签: c# date gregorian-calendar umalquracalendar


【解决方案1】:

DateTime 可以在其构造函数中接受带有替代日历的输入,但在内部,它始终使用公历等价形式存储。所以你已经有了你要找的东西。

Calendar umAlQura = new UmAlQuraCalendar();
DateTime dt = new DateTime(1434, 11, 23, umAlQura);

// As a string, it will format with whatever the calendar for the culture is.
Debug.WriteLine(dt.ToString("d", CultureInfo.InvariantCulture)); // 09/29/2013
Debug.WriteLine(dt.ToString("d", new CultureInfo("ar-SA")));     // 23/11/34

// But the individual integer properties are always Gregorian
Debug.WriteLine(dt.Year);  // 2013
Debug.WriteLine(dt.Month); // 9
Debug.WriteLine(dt.Day);   // 29

换个方向,你必须使用日历对象上的方法来获取零件。

DateTime dt = new DateTime(2013, 9, 29);  // Gregorian

Calendar umAlQura = new UmAlQuraCalendar();

Debug.WriteLine(umAlQura.GetYear(dt));       // 1434
Debug.WriteLine(umAlQura.GetMonth(dt));      // 11
Debug.WriteLine(umAlQura.GetDayOfMonth(dt)); // 23

【讨论】:

    【解决方案2】:

    看来DateTime 中保存的日期总是在当前日历中。所以如果当前日历是公历,hijriDate 已经是公历了。

    var hijriDate = new DateTime(1434, 11, 23, hijri);
    //Console writeline will show 2013-09-29 00:00:00
    

    如果您当前的日历是 UmAlQuraCalendar,您应该能够使用以下方法提取公历日期:

    var hijri = new UmAlQuraCalendar();
    var cal = new GregorianCalendar();
    
    var hijriDate = new DateTime(1434, 11, 23, hijri);
    var y = cal.GetYear(hijriDate), 
    var m = cal.GetMonth(hijriDate), 
    var d = cal.GetDayOfMonth(hijriDate)
    

    【讨论】:

    • 其实DateTime在内部总是公历,所以这有点多余。
    • 工作正常。谢谢:)
    【解决方案3】:

    作为扩展方法

    public static DateTime GregorianToUmAlQura(this DateTime gregorianDate)
    {
        Calendar umAlQura = new UmAlQuraCalendar();
    
        return new DateTime(umAlQura.GetYear(gregorianDate), umAlQura.GetMonth(gregorianDate), umAlQura.GetDayOfMonth(gregorianDate), umAlQura);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 2016-08-06
      • 1970-01-01
      相关资源
      最近更新 更多