6
votes

TimezoneInfo.ConvertiTime ne convertit rien

exécution ASP.NET MVC 2 sur Win 7 avec .NET 4.0

J'ai une méthode d'action du contrôleur qui reçoit 2 objets DateTime d'un formulaire. L'interface utilisateur sur la forme utilise le jQueryui datePicker (pas sûr si cela Mathers). P>

L'utilisateur qui remplit ce formulaire entrera toujours entrer la date / heure du fuseau horaire hawaïen. P>

Je souhaite convertir cela en UTC Time et le stocker dans une base de données. P>

Quand j'appelle TimezoneInfo.convertime (DateTime, TimezoneInfo, TimeZoneInfo) Il renvoie exactement la même dateTime que je l'ai transmise sans faire conversion. J'ai vérifié le débogueur et la seule chose qui a changé était-elle modifiée la propriété DateTime.Kind sur denttimekind.utc. P> xxx pré>

J'ai aussi essayé une version alternative aussi avec le mêmes résultats. P>

public ActionResult New(ScheduleNew data){
    DateTime start = new DateTime( data.StartDate.Year, data.StartDate.Month, data.StartDate.Day, data.StartDate.Hour, data.StartDate.Minute, data.StartDate.Second, DateTimeKind.Unspecified );
    DateTime end = new DateTime( data.EndDate.Year, data.EndDate.Month, data.EndDate.Day, data.EndDate.Hour, data.EndDate.Minute, data.EndDate.Second, DateTimeKind.Unspecified );

    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById( "Hawaiian Standard Time" );

    StartDate = TimeZoneInfo.ConvertTime(start, tz, TimeZoneInfo.Utc);
    EndDate = TimeZoneInfo.ConvertTime(end, tz, TimeZoneInfo.Utc),
}


2 commentaires

Avez-vous résolu le problème?


Quel était le genre de données.Startdate?


4 Réponses :


4
votes

Si vous voulez une approche plus flexible, essayez quelque chose comme ceci: XXX

Cela devrait fonctionner correctement, quel que soit le fuseau horaire que vous utilisez. Au fait: si j'étais vous, je créerais des dates de démarrage et de fin comme DateTimekind.utc (et stockez toutes les données de l'annexe comme UTC). Je ne sais pas comment getutcoffset () fonctionnera avec un type de temps non spécifié ...

update sur gettcoffset ()

Il semble que getutcoffset () fonctionne exactement la même chose pour les datetés créées avec différentes valeurs DateTimeKind. Cependant, je ne l'ai pas testé avec une entrée non valide (c'est-à-dire avec des dates qui n'existent pas en raison d'une commutation de temps d'économie de jour). Je crois que denttitimekind.utc est assez enregistré ici, mais cela pourrait pour la locale ou non spécifiée.


0 commentaires

2
votes

Je ne trouve aucun problème avec votre code ... On dirait que c'est devrait travail. Avez-vous essayé l'alternative de: xxx


0 commentaires

2
votes

Essayez ce code

var dt = new DateTime(YourOldDate.Ticks, DateTimeKind.Utc);
DateTime NewDate = TimeZoneInfo.ConvertTime(dt, TimeZoneInfo.Local);


0 commentaires

1
votes

Il semble être que dans le code, vous ne faites rien avec le résultat de la conversion.

public ActionResult New(ScheduleNew data){         
    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById( "Hawaiian Standard Time" );

    DateTime start = TimeZoneInfo.ConvertTime(data.StartDate, tz, TimeZoneInfo.Utc);
    DateTime end = TimeZoneInfo.ConvertTime(data.EndDate, tz, TimeZoneInfo.Utc);
}


0 commentaires