2014-12-18 16 views
5

Sto provando ad emettere una data del calendario ebraico in inglese con C#. Le seguenti uscite la data in ebraico:Come ottenere il nome del mese inglese dal calendario ebraico in 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)); 

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

per il 18 dicembre 2014. Modifica il CultureInfo per "it-IT" solleva "Non è un calendario valido per la cultura data. " errore. Sto cercando di ottenere

26 Kislev 5775 

e

26-09-5775 
+0

Questo è già stato risposto qui: http://stackoverflow.com/questions/8711390/get-the- complete-month-name-in-inglese – user3036342

+0

@ user3036342: Credo che la risposta collegata userà * Settembre * come nome del mese e non * Kislev * che è il nome del mese ebraico trascritto usando l'alfabeto latino. –

+0

@ user3036342 Questa domanda è irrilevante. –

risposta

0

So che questa non è una risposta ideale, ma si potrebbe inserire manualmente l'elenco dei mesi ebraici, e utilizzare DateTime.Today.Month come un indice in quella lista . Allo stesso modo, DateTime.Today.Day e .Year forniscono l'output intero che è possibile utilizzare. Scusa, sembra un po 'sbagliato pubblicare la tua formattazione, vero?

È ancora possibile utilizzare string.format() per garantire che l'aspetto sia quello desiderato.

0

È possibile utilizzare questo (io so che non è C#, ma si dovrebbe essere in grado di ottenere quello che sto facendo qui):

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"))) 

Ma vi darà il nome calendario gregoriano (dicembre)

suggerimento

di piojo per costruire un oggetto dizionario che contiene la versione inglese del nome ebraico potrebbe funzionare meglio

0

non credo che il .NET ha informazioni cultura che si desidera utilizzare. Tuttavia, è possibile creare il proprio CultureInfo e modificare il DateTimeFormat base alle proprie esigenze:

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[] { ... };  

(. Ci scusiamo per non aver fornito le traduzioni corrette, ma non so l'ebraico)

È quindi possibile utilizzare questo cultureInfo esattamente come fai nella tua domanda.

Se necessario è anche possibile modificare i nomi dei giorni in modo simile.

È importante impostare il calendario prima di modificare le varie proprietà del nome del mese e della data. Il numero di voci previste nelle matrici del nome del mese cambia man mano che il calendario cambia.

1

Opzione 1:

È possibile sostituire le proprietà DateTimeFormatInfo.MonthNames e MonthGenitiveNames così come la loro corrispondente AbbreviatedMonthNames e AbbreviatedMonthGenitiveNames proprietà.

Sono semplici 1-dimensionali string[] array e hanno un setter pubblico, che permette di aggiungere le vostre traduzioni personalizzate al CultureInfo:

Quando questa proprietà è impostata, la matrice deve essere unidimensionale e deve avere esattamente 13 elementi. Gli oggetti del calendario accettano i calendari con 13 mesi. Il primo elemento (l'elemento a zero dell'indice) rappresenta il primo mese dell'anno definito dalla proprietà Calendar.

Se si imposta la proprietà MonthNames, è necessario impostare anche la proprietà MonthGenitiveNames .

Se il modello personalizzato include il modello di formato "MMMM", DateTime.ToString visualizza il valore della MonthNames al posto del "MMMM" nel modello di formato.

Questa proprietà è interessata se il valore della proprietà Calendario cambia.

Così si potrebbe modificare il vostro esempio di codice a questo:

// 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; 

Questi nomi saranno poi utilizzati con il tuo stringa di formato in uscita, proprio come si desidera avere.

Ogni volta che si modifica il calendario, queste sostituzioni andranno perse. Quindi è necessario assicurarsi di riassegnare i valori personalizzati se ne avete bisogno.

[Update] Opzione 2:

Un approccio più persistente potrebbe essere quella di utilizzare il CultureAndRegionInfoBuilder Class.

Definisce una cultura personalizzata nuova o basata su un'altra cultura e il paese/regione . La cultura personalizzata può essere installata su un computer e successivamente utilizzata da qualsiasi applicazione in esecuzione su quel computer.

È possibile creare una versione di sostituzione completa della cultura "he-IL" o creare una variante con solo le traduzioni personalizzate o qualsiasi altra cosa nel mezzo.

Utilizzando questo approccio non è necessario assicurarsi manualmente che le traduzioni siano in atto dopo ogni interruttore Cultura nell'appliazione come nell'opzione 1. Una volta registrata la nuova cultura personalizzata, è possibile utilizzarla come qualsiasi altro CultureInfo .

Si prega di notare che la vostra applicazione avrà bisogno di privilegi amministrativi per registrare una nuova cultura personalizzata.

La creazione di una cultura personalizzata non è troppo complicata come mostra il seguente frammento di codice.

Esempio da MSDN: CultureAndRegionInfoBuilder

L'esempio seguente definisce una lingua personalizzata RU-USA che rappresenta la lingua russa negli Stati Uniti. L'esempio definisce la cultura personalizzata caricando le impostazioni dall'oggetto CulturaInfo russo (Russia) e dall'oggetto RegionInfo statunitense, quindi imposta un numero di proprietà CultureAndRegionInfoBuilder. Nell'esempio viene registrata la cultura personalizzata, quindi viene creata un'istanza e viene creata la cultura di thread corrente come .

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 
+1

Questo è sulla strada giusta, ma non funziona per gli anni bisestili ei numeri del giorno sono ancora resi in ebraico. Come imposti la matrice MonthNames per gli anni bisestili? Come si imposta la matrice DayNumbers? – MarkF

3

io non riuscivo a capire come impostare l'array di nomi di mese per gli anni bisestili o la serie di numeri al giorno in modo che essi siano resi come numeri inglese piuttosto che lettere ebraiche. La mia soluzione era:

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; 
} 
Problemi correlati