mercredi 21 mai 2014

c# - bonne méthode d'obtention de la zone de temps universel - Stack Overflow


In my project I want to get the universal time zone. I used two different kinds of approaches but I don't know which one is the best practice.


First approach is


public static DateTime GetUniversalTime(DateTime localDateTime)
{
TimeZone zone = TimeZone.CurrentTimeZone;
DateTime universal = zone.ToUniversalTime(localDateTime);
return universal;
}

then I want revert to local time I used the below method:


public static DateTime GetLocalTime(DateTime universalDateTime)
{
TimeZone zone = TimeZone.CurrentTimeZone;
DateTime local = zone.ToLocalTime(universalDateTime);
return local;
}

and second approach is get universal time zone DateTime.UtcNow; then I want to revert to local time I used the above GetLocalTime method.


Can one explain what is the different between the above two approaches?


Which one is the best practice ?




Since you are asking about best practices:



  • Do not use the TimeZone class. If you need time zone conversions, use the TimeZoneInfo class instead. This is very clear in the MSDN documentation:

    MSDN


  • Whenever possible, avoid any use of "local" time. It is local to the system where the code is running. In the vast majority of real-world use cases, it is likely that it is not the local time zone of your user. This is especially true in a web application.

    That means you should not be calling any of the following:



    • DateTime.Now

    • TimeZone.CurrentTimeZone

    • TimeZoneInfo.Local

    • DateTime.ToLocalTime()

    • DateTime.ToUniversalTime()

    • Any other method that involves the server's local time zone.



  • Instead, your application should allow the user to select a time zone, then you can convert to and from the local time in that zone using the TimeZoneInfo.Convert... methods.


  • If you need the current universal time, use DateTime.UtcNow or DateTimeOffset.UtcNow.


  • If you need the current local time zone of your server, ONLY use DateTimeOffset.Now.


  • If you need the current local time in a known time zone, such as US Eastern Time:

    DateTime easternNow = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
    DateTime.UtcNow, "Eastern Standard Time");

  • If you want to convert between a known time zone and UTC, then use the TimeZoneInfo.ConvertTimeToUtc and TimeZoneInfo.ConvertTimeFromUtc methods, and be sure to pass in the time zone you are converting to/from:

    // get the local time zone of your user, not of the server!
    TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

    // use this to convert from UTC to local
    DateTime local = TimeZoneInfo.ConvertTimeFromUtc(yourUtcDateTime, tzi);

    // use this to convert from local to UTC
    DateTime utc = TimeZoneInfo.ConvertTimeToUtc(yourLocalDateTime, tzi);

    Be aware that when you convert from local to UTC, you might encounter ambiguities during daylight saving time transitions. Read more in the DST tag wiki.



Additional reading: The Case Against DateTime.Now




For Universal Time.


DateTime.Now.ToUniversalTime()

For Local Time


DateTime.UtcNow.ToLocalTime()

Universal To Local


var nowUtc = DateTime.Now.ToUniversalTime();
var nowLocal = nowUtc.ToLocalTime();


In my project I want to get the universal time zone. I used two different kinds of approaches but I don't know which one is the best practice.


First approach is


public static DateTime GetUniversalTime(DateTime localDateTime)
{
TimeZone zone = TimeZone.CurrentTimeZone;
DateTime universal = zone.ToUniversalTime(localDateTime);
return universal;
}

then I want revert to local time I used the below method:


public static DateTime GetLocalTime(DateTime universalDateTime)
{
TimeZone zone = TimeZone.CurrentTimeZone;
DateTime local = zone.ToLocalTime(universalDateTime);
return local;
}

and second approach is get universal time zone DateTime.UtcNow; then I want to revert to local time I used the above GetLocalTime method.


Can one explain what is the different between the above two approaches?


Which one is the best practice ?



Since you are asking about best practices:



  • Do not use the TimeZone class. If you need time zone conversions, use the TimeZoneInfo class instead. This is very clear in the MSDN documentation:

    MSDN


  • Whenever possible, avoid any use of "local" time. It is local to the system where the code is running. In the vast majority of real-world use cases, it is likely that it is not the local time zone of your user. This is especially true in a web application.

    That means you should not be calling any of the following:



    • DateTime.Now

    • TimeZone.CurrentTimeZone

    • TimeZoneInfo.Local

    • DateTime.ToLocalTime()

    • DateTime.ToUniversalTime()

    • Any other method that involves the server's local time zone.



  • Instead, your application should allow the user to select a time zone, then you can convert to and from the local time in that zone using the TimeZoneInfo.Convert... methods.


  • If you need the current universal time, use DateTime.UtcNow or DateTimeOffset.UtcNow.


  • If you need the current local time zone of your server, ONLY use DateTimeOffset.Now.


  • If you need the current local time in a known time zone, such as US Eastern Time:

    DateTime easternNow = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
    DateTime.UtcNow, "Eastern Standard Time");

  • If you want to convert between a known time zone and UTC, then use the TimeZoneInfo.ConvertTimeToUtc and TimeZoneInfo.ConvertTimeFromUtc methods, and be sure to pass in the time zone you are converting to/from:

    // get the local time zone of your user, not of the server!
    TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

    // use this to convert from UTC to local
    DateTime local = TimeZoneInfo.ConvertTimeFromUtc(yourUtcDateTime, tzi);

    // use this to convert from local to UTC
    DateTime utc = TimeZoneInfo.ConvertTimeToUtc(yourLocalDateTime, tzi);

    Be aware that when you convert from local to UTC, you might encounter ambiguities during daylight saving time transitions. Read more in the DST tag wiki.



Additional reading: The Case Against DateTime.Now



For Universal Time.


DateTime.Now.ToUniversalTime()

For Local Time


DateTime.UtcNow.ToLocalTime()

Universal To Local


var nowUtc = DateTime.Now.ToUniversalTime();
var nowLocal = nowUtc.ToLocalTime();

0 commentaires:

Enregistrer un commentaire