如何从C#中的希伯来日历中获取英文月份名称

时间:2014-12-18 08:03:28

标签: c# datetime

我正在尝试使用C#输出英语的希伯来语日历日期。以下以希伯来语输出日期:

    var ci = System.Globalization.CultureInfo.CreateSpecificCulture("he-IL");
    ci.DateTimeFormat.Calendar = new System.Globalization.HebrewCalendar();
    Response.Write(DateTime.Today.ToString("MMM d, yyyy", ci));
    Response.Write(DateTime.Today.ToString("d-M-y", ci));

给出

כסלו כ"ו, תשע"ה
כ"ו-ג'-תשע"ה

2014年12月18日。将CultureInfo更改为" en-US"为特定文化提出一个不是有效的日历。"错误。我想要

26 Kislev 5775

26-09-5775

5 个答案:

答案 0 :(得分:3)

我无法弄清楚如何设置闰年的月份名称数组或日期数字数组,以便将它们呈现为英文数字而不是希伯来字母。我的解决方案是:

Globals.cs

    public static string[] HebrewMonthNames =
    {
      "Tishrei",
      "Cheshvan",
      "Kislev",
      "Tevet",
      "Shevat",
      "Adar",
      "Nissan",
      "Iyar",
      "Sivan",
      "Tamuz",
      "Av",
      "Elul"
    };

    public static string[] HebrewMonthNamesLeapYear =
    {
      "Tishrei",
      "Cheshvan",
      "Kislev",
      "Tevet",
      "Shevat",
      "Adar I",
      "Adar II",
      "Nissan",
      "Iyar",
      "Sivan",
      "Tamuz",
      "Av",
      "Elul"
    };

Utils.cs

public string FormatHebrewDate(DateTime dtGregorian)
{
                System.Globalization.HebrewCalendar hCal = new System.Globalization.HebrewCalendar();
                string sDate = hCal.GetDayOfMonth(dtGregorian).ToString() + " ";
                if (hCal.IsLeapYear(hCal.GetYear(dtGregorian)))
                {
                    sDate += Globals.HebrewMonthNamesLeapYear[hCal.GetMonth(dtGregorian) - 1];
                }
                else
                {
                    sDate += Globals.HebrewMonthNames[hCal.GetMonth(dtGregorian) - 1];
                }
                sDate += " " + hCal.GetYear(dtGregorian).ToString();
                return sDate;
}

答案 1 :(得分:1)

选项1:

您可以覆盖DateTimeFormatInfo.MonthNamesMonthGenitiveNames属性及其相应的AbbreviatedMonthNamesAbbreviatedMonthGenitiveNames属性。

它们是简单的一维 string[] 数组,并且有一个公共设置器,它允许您将自定义翻译添加到CultureInfo:

  

设置此属性后,数组必须是一维的并且必须   有13个元素。日历对象可以使用日历   13个月。第一个元素(索引为零的元素)表示   由Calendar属性定义的一年中的第一个月。

     

如果设置MonthNames属性,则还必须设置   MonthGenitiveNames属性。

     

如果自定义模式包含格式模式“MMMM”,   DateTime.ToString显示MonthNames的值代替   格式模式中的“MMMM”。

     

如果Calendar属性的值,此属性会受到影响   变化。

所以你可以修改你的代码示例:

// I am just using German Number representations for the example.
// Use additional string Arrays to suit the abbrevated
// and the Genetive names.
// Replaye with whatever suits your needs.
string[] monthNames =
    {
      "Eins",
      "Zwei",
      "Drei",
      "Vier",
      "Fünf",
      "Sechs",
      "Sieben",
      "Acht",
      "Neun",
      "Zehn",
      "Elf",
      "Zwölf",
      string.Empty
    };

// Assign each string Array to its corresponding property.
// I am using the same Array here just as an example for
// what is possible and because I am lazy... :-)
ci.DateTimeFormat.MonthNames = monthNames;
ci.DateTimeFormat.MonthGenitiveNames = monthNames;
ci.DateTimeFormat.AbbreviatedMonthNames = monthNames;
ci.DateTimeFormat.AbbreviatedMonthGenitiveNames = monthNames;

然后,这些名称将与输出中的格式字符串一起使用,就像您希望的那样。

每次更改日历时,这些覆盖都将丢失。因此,如果需要,您需要确保重新分配自定义值。

[更新]选项2:

更持久的方法可能是使用CultureAndRegionInfoBuilder类。

  

定义新的或基于其他文化的自定义文化   国家/地区。自定义文化可以安装在计算机上   随后由该计算机上运行的任何应用程序使用。

您可以创建"he-IL"文化的完整替代版本,也可以仅使用自定义翻译或其间的任何内容创建变体。

使用此方法,您无需手动确保在应用程序中的每个Culture-switch之后翻译都已就位,如选项1中所示。一旦注册了新的自定义文化,您就可以像使用任何其他CultureInfo一样使用它。

请注意,您的申请需要管理权限才能注册新的自定义文化。

自定义文化的创建并不像下面的代码片段那样复杂。

来自MSDN的示例:CultureAndRegionInfoBuilder

  

以下示例定义了表示的自定义ru-US文化   美国的俄语。该示例定义了   通过加载俄罗斯(俄罗斯)的设置来定制文化   CultureInfo对象和美国RegionInfo对象,然后设置一个   CultureAndRegionInfoBuilder属性的数量。这个例子   注册自定义文化,然后实例化它并制作它   当前的线程文化。

using System;
using System.Globalization;
using System.Threading;

public class Example
{
   public static void Main()
   {
      // Create a custom culture for ru-US.
      CultureAndRegionInfoBuilder car1 = new CultureAndRegionInfoBuilder("ru-US", 
                                             CultureAndRegionModifiers.None);
      car1.LoadDataFromCultureInfo(CultureInfo.CreateSpecificCulture("ru-RU"));
      car1.LoadDataFromRegionInfo(new RegionInfo("en-US"));

      car1.CultureEnglishName = "Russian (United States)";
      car1.CultureNativeName = "русский (США)";
      car1.CurrencyNativeName = "Доллар (США)";
      car1.RegionNativeName = "США";

      // Register the culture. 
      try {
         car1.Register();
      }    
      catch (InvalidOperationException) {
         // Swallow the exception: the culture already is registered.
      }

      // Use the custom culture.
      CultureInfo ci = CultureInfo.CreateSpecificCulture("ru-US");
      Thread.CurrentThread.CurrentCulture = ci;
      Console.WriteLine("Current Culture: {0}", 
                        Thread.CurrentThread.CurrentCulture.Name);
      Console.WriteLine("Writing System: {0}", 
                        Thread.CurrentThread.CurrentCulture.TextInfo);
   }
}
// The example displays the following output: 
//     Current Culture: ru-US 
//     Writing System: TextInfo - ru-US

答案 2 :(得分:0)

我知道这不是一个理想的答案,但您可以手动输入希伯来语月份列表,并使用DateTime.Today.Month作为该列表的索引。同样,DateTime.Today.Day.Year给出了可以使用的整数输出。抱歉,滚动自己的格式似乎有点不对,不是吗?

你仍然可以使用string.format()来确保它看起来像你想要的那样。

答案 3 :(得分:0)

你可以使用它(我知道它不是c#,但你应该能够得到我在这里做的事情):

 Dim c As New CultureInfo("he-IL")
        c.DateTimeFormat.Calendar.ToDateTime(Now.Year, Now.Month, Now.Day, Now.Hour, Now.Minute, Now.Second, Now.Millisecond).ToString("MMMM", New CultureInfo("en-GB"))
        MessageBox.Show(c.DateTimeFormat.Calendar.ToDateTime(Now.Year, Now.Month, Now.Day, Now.Hour, Now.Minute, Now.Second, Now.Millisecond).ToString("MMMM", New CultureInfo("en-GB")))

但它会给你阳历日历名称(12月)

piojo建议建立一个包含英文版希伯来名字的字典对象可能会更好用

答案 4 :(得分:0)

我不相信.NET有您想要使用的文化信息。但是,您可以创建自己的CultureInfo并修改DateTimeFormat以满足您的需求:

var cultureInfo = CultureInfo.CreateSpecificCulture("he-IL");
cultureInfo.DateTimeFormat.Calendar = new HebrewCalendar();
cultureInfo.DateTimeFormat.AbbreviatedMonthNames = new[] {
  "Translation of תשרי",
  "Translation of חשון",
  // 11 more elements
};
cultureInfo.DateTimeFormat.AbbreviatedMonthGenitiveNames = new[] { ... };
cultureInfo.DateTimeFormat.MonthNames = new[] { ... };
cultureInfo.DateTimeFormat.MonthGenitiveNames = new[] { ... };    

(很抱歉没有提供正确的翻译,但我不知道希伯来语。)

然后,您可以像在问题中一样使用此cultureInfo

如果需要,您还可以以类似的方式修改日期名称。

在修改各种月份和日期名称属性之前设置日历非常重要。月份名称数组中的预期条目数会随着日历的更改而更改。