2014-11-12 15 views
6

Io uso la modalità ADO disconnesso per ottenere dati da datatbase compilando DataSet ds tutti i dati che si avvera tranne la data archiviatoasp.net datetime arabica errore

string strDate = ds.Tables[0].Rows[0]["H_DT"].ToString(); 

viene generata un'eccezione dice:

L'orario specificato non è supportato in questo calendario. Dovrebbe essere tra 04/30/1900 00:00:00 (data gregoriana) e 11/16/2077 23:59:59 (data gregoriana), incluso.

Ho provato a scrivere questo codice

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("ar-sa"); 
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("ar-sa"); 

per cambiare la cultura araba, ma senza alcuna fortuna, si prega di qualcuno mi può aiutare

Aggiornamento:

il seguente è screenshot di quick watch per la variabile

enter image description here

+2

Qual è il valore di 'ds.Tables [0 ] .Rows [0] ["H_DT"] 'esattamente? Esegui il debug del tuo codice e comunicacelo. –

+0

Soner, ho modificato la mia domanda con screenshot –

+0

nodo data exapnd anche nella vostra schermata girato –

risposta

7

Da DateTime.ToString method

Il metodo ToString() restituisce la rappresentazione di stringa di data e l'ora nel calendario utilizzato dalla cultura corrente. Se il valore della corrente DateTime istanza è precedente Calendar.MinSupportedDateTime o dopo Calendar.MaxSupportedDateTime, il metodo genera un ArgumentOutOfRangeException.

Il calendario di default della cultura ar-sa è UmAlQuraCalendar calender.

var culture = CultureInfo.GetCultureInfo("ar-sa"); 
Console.WriteLine(culture.Calendar); // prints UmAlQuraCalendar 

E da UmAlQuraCalendar.MinSupportedDateTime Property

La prima data e l'ora supportato dalla classe UmAlQuraCalendar, che è equivalente al primo momento di 30 aprile 1900 C.E. nel calendario gregoriano.

Dal momento che il DateTime è 1, 1, 1398, è troppo normale per tiri ArgumentOutOfRangeException.

È possibile risolvere il problema fornendo un parametro IFormatProvider nel proprio metodo DateTime.ToString() che dispone di GregorianCalendar per impostazione predefinita. Ad esempio, è possibile utilizzare InvariantCulture.

string strDate = ds.Tables[0].Rows[0]["H_DT"].ToString(CultureInfo.InvariantCulture); 

ho scritto configurazione globalizzazione in Web config come ar-sa essere globale in tutte le applicazioni, ma ho affrontato lo stesso errore, si prega di precisare me, grazie

Un DateTime appartiene il calendario gregoriano per impostazione predefinita. Da DateTime structure;

Ogni DateTime utente utilizza implicitamente il calendario gregoriano per eseguire il suo funzionamento, con l'eccezione dei costruttori che specificano un calendario , e metodi con un parametro derivato da IFormatProvider, quali System.Globalization.DateTimeFormatInfo, che implicitamente specifica un calendario.

Ciò significa che il tuo datario ds.Tables[0].Rows[0]["H_DT"] è il calendario Gregoriano per impostazione predefinita. Ma dato che usi il metodo .ToString() senza alcun parametro, il tuo metodo usa il tuo CurrentCulture che è ar-sa da quando lo hai scritto nel tuo web.config. E quella cultura ha il calendario UmAlQuraCalendar per impostazione predefinita. Dato che il tuo datetime è fuori portata in questo calendario, il tuo codice genera un'eccezione.

Ricordate, avete un DateTime con 1318 come un anno di calendario Gregoriano, non1318 come un anno in UmAlQuraCalendar calendario.

Come esempio;

var date = new DateTime(1318, 1, 1); 
Console.WriteLine(date.ToString(new CultureInfo("ar-sa"))); 

tiri ArgumentOutOfRangeException eccezione, perché è esattamente lo stesso caso del tuo. Questo è un DateTime che è un anno 1318 in un calendario gregoriano, ma non c'è alcuna rappresentazione sul calendario UmAlQuraCalendar di questo datetime perché nel calendario UmAlQuraCalendar, gli anni iniziano con 1900 nel calendario gregoriano.

Dai un'occhiata a come UmAlQuraCalendar calender implemented;

//////////////////////////////////////////////////////////////////////////// 
// 
// Notes about UmAlQuraCalendar 
// 
//////////////////////////////////////////////////////////////////////////// 
/* 
** Calendar support range: 
**  Calendar Minimum  Maximum 
**  ========== ========== ========== 
**  Gregorian 1900/04/30 2077/11/17 
**  UmAlQura 1318/01/01 1500/12/30 
*/ 
+0

Grazie mille Soner, è stato risolto con la tua gran soluzione, favore ho bisogno di capire qualcosa che hai detto "The ToString() metodo restituisce la rappresentazione della stringa della data e dell'ora nel calendario utilizzato dalla cultura corrente.Se il valore dell'istanza DateTime corrente è precedente a Calendar.MinSupportedDateTime o successiva a Calendar.MaxSupportedDateTime, il metodo genera un'eccezione ArgumentOutOfRangeException " Ho scritto configurazione di globalizzazione in web config come ar-sa per essere globale in tutte le applicazioni ma ho affrontato lo stesso errore, per favore chiariscimi, grazie –

+0

e per questa parte "La prima data e ora supportate dalla classe UmAlQuraCalendar, che equivale al primo momento del 30 aprile 1900 C.E. nel calendario gregoriano. Dato che DateTime è 1, 1, 1398, è troppo normale per generare ArgumentOutOfRangeException " data 1/1/1398 solo 38 anni fa è dopo il 1900 Gregoriano di molti anni –

+0

@AbrahamJosef Aggiornato la mia risposta con ulteriori spiegazioni. Guarda. –

0

Prova questo:

var ci = CultureInfo.CreateSpecificCulture("ar-SA"); 
string strDate = ds.Tables[0].Rows[0]["H_DT"].ToString(ci); 

passerete ti cultura desiderata quando si sta convertendo la data a stringa.

0

---> causa di questo problema

la data di Hijri in DateTime oggetto in C# è compresa tra 1318/01/01 e 30/12/1500.

in data gregoriano è tra gli anni 1900 e 2077

quindi se apriamo il database SQL e ottenere la data e convertire in data Hijri notiamo che non è tra la data 2 Hijri sopra

a assicurarsi la possibilità di convertirlo con l'apertura di qualsiasi sito convertitore online


----> soluzioni

0.123.516,41 mila

si hanno 2 soluzione per risolvere questo problema

-solusion 1

è possibile aggiornare i valori di data in SQL

impostarlo ad oggi vero e proprio (tra il 1900 e il 2077)

O

-solution 2

nel codice prima di ottenere la data dalla fila DataTable si dovrebbe impostare la CurrentCulture a "en" e quando hai finito il codice è necessario impostare la lingua "ar" .

controllo il codice qui sotto

bool isLanguageChanged = false; 
if (Thread.CurrentThread.CurrentCulture.Name == "ar") 
{ 
    isLanguageChanged = true; 

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en"); 
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en"); 
} 

string dateStr = dataTable.Rows[i]["DateColumn"].ToString(); 

if (isLanguageChanged) 
{ 
    Thread.CurrentThread.CurrentCulture = new CultureInfo("ar"); 
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("ar"); 
} 
0

Utilizzare il InvariantCulture durante la conversione date in stringhe sotto culture limitate, proprio come questo:

using System.Globalization; 
string str = someDate.ToString(CultureInfo.InvariantCulture); 
Problemi correlati