9
votes

Timespan et UTC

J'ai une variable TIMPAN, qui a du temps dans un fuseau horaire local, mais pour une base de données (heure de type à froid), j'ai besoin de passer de l'UTC. Comment puis-je faire cela? De plus, j'ai besoin d'obtenir l'UTC à l'heure locale pour renseigner la variable Timespan sur Pageload. Merci !!!


0 commentaires

5 Réponses :


15
votes

Je suppose que je chargerais la période de temps dans une date d'heure, puis obtenez le temps universel à partir de la dateTime et de le convertir à nouveau.

var dt = new DateTime( timeSpan.Ticks );
var utc = dt.ToUniversalTime();


6 commentaires

Vous ne convertissez pas 20h de l'est de manière correcte vers UTC Dim DT en tant que nouvelle DateTime (Time.Ticks) dt = dt.touniversaltime () DM DTUniversal comme nouvelle Timespan (dt.ticks)


Les tiques représentent peut-être différentes choses? Différents systèmes utilisent différentes représentations de tiques - généralement la date de commencer à compter des millisecondes. Si vous pouvez convertir votre période de temps en valeurs spécifiques pour l'année, le mois, la journée, etc. Vous pouvez créer une date de date à partir de ces valeurs, puis la convertir en UTC.


Comme vous l'avez suggéré, comment puis-je construire DateTime? Tout ce que je stocke dans la base de données est l'heure et les minutes par défaut et les secondes sont alwyas 00. EG. Ma valeur stockée est 01:00:00 Comment puis-je convertir cela en DateTime? - Merci


J'accepterai celui-ci que j'ai fait quelques changements, mais c'était un bon point de départ pour moi - merci


Cela ne fonctionnera que si le tispan a la composante de date incluse, pas seulement l'heure. Dans mon cas, je convertissez une période de temps sur l'UTC. Cet exemple de code aboutira donc toujours le 01/01/0001 et ne tient pas compte de la journée.


J'ai utilisé votre méthode pour le faire et je veux maintenant présenter ce Timespan UTC au format DateTime UTC. Pouvez-vous répondre à ma question => Stackoverflow.com/questions/67208648/...



4
votes
TimeSpan LocalTimeToUTCTime(TimeSpan localTime)
{
    var dt = new DateTime(localTime.Ticks);
    var utc = dt.ToUniversalTime();
    return new TimeSpan(utc.Ticks);
}

0 commentaires

5
votes
class TimeConversion
{
    public static TimeSpan LocalTimeSpanToUTC(TimeSpan ts)
    {
        DateTime dt = new DateTime(ts.Ticks).AddDays(1);
        DateTime dtUtc = dt.ToUniversalTime();
        TimeSpan tsUtc = dtUtc.TimeOfDay;

        return tsUtc;
    }

    public static TimeSpan UTCTimeSpanToLocal(TimeSpan tsUtc)
    {
        DateTime dtUtc = new DateTime(tsUtc.Ticks).AddDays(1);
        DateTime dt = dtUtc.ToLocalTime();
        TimeSpan ts = dt.TimeOfDay;

        return ts;
    }
}

2 commentaires

Quelle raison de Adddays (1)?


@Miles Je peux répondre à cela parce que j'ai essayé une autre réponse et que cela n'a pas fonctionné parce que je suis dans une zone UTC +10 UTC et que cela ne pouvait rien soustraire à partir de la date 1/1/0001.



2
votes

Un problème que j'ai trouvé avec quelques réponses précédentes est que la création d'une date d'heure à partir de tiques entraîne une date / heure telle que 0001-01-01 04:00:00 code>. Si vous êtes dans un fuseau horaire avec un décalage uc positif lorsque le cadre tente de soustraire 10 heures, il devient inférieur à 10 heures. 00:00:00 code> au lieu du résultat correct.

La réponse par ali Sepehri .Kh se déplace autour de cette sous-fleuve en utilisant .Addays (1) code> Toutefois, car la date est toujours du 1er janvier pour les zones qui observent DST, vous pouvez vous retrouver avec un résultat incorrect. Parce que je n'étais intéressé que par Timespans pour le jour actuel, j'ai fini par utiliser une version modifiée du code d'Ali qui utilise la date actuelle comme base et ajoute la trajectoire à l'autre: P>

public static TimeSpan LocalTimeSpanToUTC(TimeSpan ts)
{
    DateTime dt = DateTime.Now.Date.Add(ts);
    DateTime dtUtc = dt.ToUniversalTime();
    TimeSpan tsUtc = dtUtc.TimeOfDay;
    return tsUtc;
}

public static TimeSpan UTCTimeSpanToLocal(TimeSpan tsUtc)
{
     DateTime dtUtc = DateTime.UtcNow.Date.Add(tsUtc);
     DateTime dt = dtUtc.ToLocalTime();
     TimeSpan ts = dt.TimeOfDay;
     return ts;
}


1 commentaires

Vous devez ajouter 'ceci' à être des méthodes d'extension, par exemple: (ce Timespan Ts), (ce TIMEPAN TSUTC)



0
votes

courut dans cela aujourd'hui. La meilleure façon de faire cela serait d'ajouter le Timespan code> à un DateTime code> sans composant temporel.

var utcDateTime = TimeZoneInfo.ConvertTimeToUtc(dateTimeUnspecified, sourceTimeZone);


0 commentaires