我正在尝试使用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
答案 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.MonthNames和MonthGenitiveNames属性及其相应的AbbreviatedMonthNames和AbbreviatedMonthGenitiveNames属性。
它们是简单的一维 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
。
如果需要,您还可以以类似的方式修改日期名称。
在修改各种月份和日期名称属性之前设置日历非常重要。月份名称数组中的预期条目数会随着日历的更改而更改。