8
votes

Conversion de l'attribut à change (temps généralisé) dans LDAP à une date d'heure en C #

Je passe récemment à partir de l'espace de noms S.DS (qui utilise ADSI) à l'espace de noms S 2SD.Protocol. Le seul problème est que l'ADSI a géré la conversion du temps généralisé vers une date d'heure pour moi. Maintenant, je récupère une valeur de "20070828085401.0z" pour l'attribut uvechanged. DateTime.Parse () ne convertira pas cela, alors y a-t-il un autre moyen?


0 commentaires

4 Réponses :


2
votes

Vous devrez utiliser datetime.parseexact () spécifiant le format exact. Vous devrez peut-être jouer avec le format un peu, mais ce serait quelque chose comme ça. XXX


0 commentaires

6
votes

Le format que vous obtenez est proche du schéma temporel de la date d'aller-retour ("O") et de la date de date de la date d'arrondi tripable universelle ("u") Standard Date Time Format Strings comme décrit ICI .

Une solution de kludgy serait de masser la chaîne que vous obtenez adapté au motif, puis Utilisez la chaîne de format standard "O" ou "u" avec parseexact . p>

Un meilleur moyen serait de construire un format personnalisé String qui correspond aux données que vous obtenez déjà. Dans la section "Comment Standard Format Strings" de la page Format de la date standard Time Format Strings, vous verrez les chaînes de formatage personnalisées complètes équivalentes à "O" et "U". Cela devrait vous donner un bon départ. P>


EDIT STRY>: Ajouter du code P>

string format = "yyyyMMddHHmmss.f'Z'";

string target = "20070828085401.0Z";

DateTime d = DateTime.ParseExact(target, format, CultureInfo.InvariantCulture);


1 commentaires

Selon: Outils.ietf.org/html/rfc4517#section-3.3.13 Cela ne passera pas pour: 199412160532-0500



1
votes

Vous pouvez utiliser .stryptime () . xxx

TIME_OBJECT doit sortir comme DateTime.DateTetime (2007, 8, 28, 8, 54, 1) . Je crois que ce sera le Timezone naïf et équivalent à l'UTC Time.


1 commentaires

Le titre de la question et la balise laissent clairement que OP parle de c #, pas de python. Donc, cette réponse est inadéquate ici.



1
votes
// WIN32 FILETIME is a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC).
// While the unix timestamp represents the seconds since January 1, 1970 (UTC).
private static long Win32FileTimeToUnixTimestamp(long fileTime)
{
    //return fileTime / 10000L - 11644473600000L;
    return DateTimeOffset.FromFileTime(fileTime).ToUnixTimeSeconds();
}

// The GeneralizedTime follows ASN.1 format, something like: 20190903130100.0Z and 20190903160100.0+0300
private static long GeneralizedTimeToUnixTimestamp(string generalizedTime)
{
    var formats = new string[] { "yyyyMMddHHmmss.fZ", "yyyyMMddHHmmss.fzzz" };
    return DateTimeOffset.ParseExact(generalizedTime, formats, System.Globalization.CultureInfo.InvariantCulture).ToUnixTimeSeconds();
}

0 commentaires