Conversione dell’attributo WhenChanged (Generalized-Time) in LDAP a un DateTime in C #

Di recente ho passato dall’uso dello spazio dei nomi S.DS (che usa ADSI) allo spazio dei nomi S.SD.Protocol. L’unico problema è che ADSI ha gestito la conversione di Generalized-Time in un DateTime per me. Ora sto recuperando un valore di “20070828085401.0Z” per l’attributo WhenChanged. DateTime.Parse () non lo convertirà quindi c’è un altro modo?

Il formato che si sta ottenendo è simile al modello di data e ora di andata e ritorno (“o”) e alle stringhe di formato di data e ora standard di andata e ritorno (“u”) standard, come descritto qui .

Una soluzione kludgy sarebbe quella di massaggiare la stringa che si adatta al modello e quindi utilizzare la stringa di formato standard “o” o “u” con ParseExact .

Un modo migliore sarebbe quello di build una stringa di formato personalizzata che corrisponda ai dati che si stanno già ottenendo. Nella sezione “Come funzionano le stringhe di formato standard” della pagina delle stringhe del formato di data ora standard vedrai le stringhe di formattazione personalizzate complete equivalenti a “o” e “u”. Questo dovrebbe darti un buon inizio.


MODIFICA : aggiungi codice

string format = "yyyyMMddHHmmss.f'Z'"; string target = "20070828085401.0Z"; DateTime d = DateTime.ParseExact(target, format, CultureInfo.InvariantCulture); 

Nei commenti lixonn osserva che, usando la stringa di formato sopra, ParseExact non analizzerà correttamente una stringa di tempo come 199412160532-0500 .

Inoltre, non analizzerà un numero di altre stringhe valide come le ore senza l’indicatore “Zulu” finale ( 20070828085401.0 ); volte senza una parte frazionaria ( 20070828085401Z ) e tempi che rappresentano minuti e secondi come ora frazionaria ( 2007082808.90028Z ).

La stringa di formato può essere resa leggermente più tollerante sostituendo la 'Z' codificata con l’ identificatore personalizzato K che accetterà “Z”, un offset come -0500 e nulla. Che questa ulteriore flessibilità sia una buona cosa dipenderà dalla tua applicazione.

Si noti che anche con l’identificatore K specifier la stringa di Lixonn non verrà analizzata correttamente poiché manca una parte frazionaria per abbinare il componente .f della stringa di formato.

Dovrai usare DateTime.ParseExact() specificando il formato esatto. Potresti dover giocare un po ‘con il formato, ma sarebbe qualcosa di simile.

 DateTime result; CultureInfo provider = CultureInfo.InvariantCulture; string format="yyyyMMddhhmmss.0Z"; result = DateTime.ParseExact(dateString, format, provider); 

Puoi usare datetime’s .strptime() .

  import datetime # Since 0Z denotes UTC, you can get rid of it and apply the timezone # later if you would like time_string = "20070828085401.0Z".split('.')[0] time_object = datetime.datetime.strptime(time_string, "%Y%m%d%H%M%S") 

time_object deve essere prodotto come datetime.datetime(2007, 8, 28, 8, 54, 1) . Credo che sarà timezone ingenuo e equivalente al tempo UTC.