2012-04-12 13 views
13

I dati TimeSpan sono rappresentati come formato di 24 ore, ad esempio 14:00:00, voglio convertirlo in formato 12 ore, 2:00 PM, ho cercato su Google e trovato qualcosa correlato in stackoverflow e msdn, ma non ha fatto t risolvere questo problema, qualcuno può aiutarmi? Grazie in anticipo.come convertire il formato di 24 ore TimeSpan in formato 12 ore TimeSpan?

Aggiornamento Sembra che è possibile convertire il formato TimeSpan 24 ore per stringa, ma impossibile convertire la stringa in formato 12 ore TimeSpan :(

Ma ho ancora avuto buone risposte così tanti, grazie !

+1

Puoi fornire il tuo codice .. per capire il tuo problema .. – vikrantx

+0

Non è davvero chiaro puoi elaborare un po '. Il tempo non è il tempo assoluto, quindi non è possibile rappresentarlo in AM/PM. Quindi 14:00:00 non sembra essere il tempo è solo il tempo memorizzato in una variabile stringa in questo formato? –

+0

Questo [collegamento] (http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx) aiuterà – vikrantx

risposta

6

TimeSpan rappresenta un momento intervallo di non un momento della giornata. La struttura DateTime è più probabile che quello che stai cercando.

+1

In realtà' TimeSpan' è adatto per rappresentare un'ora del giorno se si assicura che 'TotalDays <1'. I sovraccarichi dell'operatore consentono di calcolare facilmente cose come "DateTime" per un evento in una data specifica e un determinato "TimeSpan" che rappresenta un'ora del giorno. Anche 'DateTime.TimeOfDay' restituirà un' TimeSpan'. –

+0

Molti punti positivi, anche se richiede un leggero cambiamento di mentalità su come viene rappresentato il tempo. È confuso pensare che il tipo "DateTime" ritorna a rappresentare un momento della giornata potrebbe potenzialmente avere un valore che in realtà si estende su _multiple_ giorni (anche se logicamente mai lo farebbe). –

1

Dando per scontato che st aying in un intervallo di 24 ore, è possibile ottenere ciò che si vuole sottraendo il negativo TimeSpan da oggi di DateTime (oa qualsiasi data è per questo), quindi a nudo la parte di data:

DateTime dt = DateTime.Today; 
dt.Subtract(-TimeSpan.FromHours(14)).ToShortTimeString(); 

Resa:

2 : 00

5

TimeSpan rappresenta un intervallo di tempo (una differenza tra i tempi), non una data o un'ora, quindi ha poco senso definirlo in formato 24 o 12 ore. Suppongo che tu voglia veramente un DateTime.

Per esempio 14:00 di oggi:

TimeSpan ts = TimeSpan.FromHours(14); 
DateTime dt = DateTime.Today.Add(ts); 

Quindi è possibile formattare quella data come si desidera:

String formatted = String.Format("{0:d/M/yyyy hh:mm:ss}", dt); // "12.4.1012 02:00:00" - german (de-DE) 

http://msdn.microsoft.com/en-us/library/az4se3k1%28v=vs.100%29.aspx

6

è necessario convertire il TimeSpan in un oggetto DateTime prima di tutto, quindi usa quello che è DateTime format che ti serve:

var t = DateTime.Now.TimeOfDay; 

Console.WriteLine(new DateTime(t.Ticks).ToString("hh:mm:ss tt")); 

funzionerebbe anche, ma dipende dalle impostazioni regionali, quindi non sarebbe visualizzato correttamente (o correttamente, a seconda di come lo si vede) su sistemi non statunitensi.

+1

È necessario specificare un 'CultureInfo' come' CultureInfo.InvariantCulture' nella chiamata 'ToString' per evitare problemi quando la cultura corrente utilizza un formato orario di 24 ore (in questo caso l'identificatore di formato' tt' inserisce una stringa vuota). –

1
String formatted = yourDateTimeValue.ToString("hh:mm:ss tt"); 
3

provare questo codice:

int timezone = 0; 

Questa stringa dà 12 ore formato

string time = DateTime.Now.AddHours(-timezone).ToString("hh:mm:ss tt"); 

Questa stringa dà formato a 24 ore

string time = DateTime.Now.AddHours(-timezone).ToString("HH:mm:ss tt"); 
22

(Riassumendo il mio commenti sparsi in una singola risposta.)

Per prima cosa è necessario comprendere che TimeSpan rappresenta un intervallo di tempo. Questo intervallo di tempo è internamente rappresentato come un conteggio di zecche e non la stringa 14:00:00 né la stringa 2:00 PM.Solo quando converti lo TimeSpan in una stringa ha senso parlare delle due diverse rappresentazioni di stringa. Passare da una rappresentazione all'altra non altera o converte il conteggio delle tacche memorizzato nello TimeSpan.

Il tempo di scrittura come 2:00 PM anziché 14:00:00 riguarda la formattazione di data e ora e la lingua. Tutto questo è gestito dalla classe DateTime.

Tuttavia, anche se TimeSpan rappresenta un intervallo di tempo, è adatto per rappresentare l'ora del giorno (DateTime.TimeOfDay restituisce un TimeSpan). Quindi non è irragionevole usarlo per quello scopo.

Per eseguire la formattazione descritta è necessario fare affidamento sulla logica di formattazione di DateTime o semplicemente creare il proprio codice di formattazione.

  • Utilizzando DateTime:

    var dateTime = new DateTime(timeSpan.Ticks); // Date part is 01-01-0001 
    var formattedTime = dateTime.ToString("h:mm tt", CultureInfo.InvariantCulture); 
    

    Gli identificatori di formato che utilizzano in ToString sono documentate nella pagina Custom Date and Time Format Strings su MSDN. È importante specificare un CultureInfo che utilizza il designatore AM/PM desiderato. Altrimenti l'identificatore di formato tt può essere sostituito dalla stringa vuota.

  • Utilizzando la formattazione personalizzata:

    var hours = timeSpan.Hours; 
    var minutes = timeSpan.Minutes; 
    var amPmDesignator = "AM"; 
    if (hours == 0) 
        hours = 12; 
    else if (hours == 12) 
        amPmDesignator = "PM"; 
    else if (hours > 12) { 
        hours -= 12; 
        amPmDesignator = "PM"; 
    } 
    var formattedTime = 
        String.Format("{0}:{1:00} {2}", hours, minutes, amPmDesignator); 
    

    Certamente questa soluzione è un po 'più complesso del primo metodo.

+0

wow ... risposta così dettagliata, 2 soluzioni e tutorial in formato personalizzato su MSDN ... grazie mille! – user1108069

+0

Questa soluzione mi ha aiutato al meglio. La mia variabile formattataTime era simile a questa: 'var formattedTime = String.Format (" {0} {1} ", ore, amPmDesignator);' –

Problemi correlati