web-dev-qa-db-fra.com

Comment convertir DateTime en fuseau horaire spécifique?

J'ai du mal à comprendre comment fonctionne UTC. 

Je dois faire ce qui suit, mais je suis toujours confus si j'obtenais le bon résultat 

Objectifs: 

  1. S'assurer que toutes les dates enregistrées dans la base de données sont au format UTC 
  2. Update DefaultTimezone est à l'heure de Manille 
  3. Assurez-vous que toutes les dates retournées sont à l'heure de Manille 

Le code est donc: 

public ConvertDate(DateTime? dateTime)
{
    if (dateTime != null)
    {
        Value = (DateTime)dateTime;
        TimeZone = GetFromConfig.DefaultTimeZone(); 
    }
}


public ConvertDate(DateTime? dateTime, int GMTTimeZone)
{
    if (dateTime != null)
    {
        Value = (DateTime)dateTime;
        TimeZone = GMTTimeZone;
    }
}


public int TimeZone
{
    get { return m_TimeZone; }
    set { m_TimeZone = value; }
}


DateTime m_Value;
public DateTime Value
{
    get { return m_Value; }
    set 
    { 
        m_Value = value;
        DateTime converted = m_Value.ToUniversalTime().ToLocalTime();
    }
}

Exemple d'utilisation: 

DateTime SampleInputFromUser = new DateTime(2012, 1, 22);
ConvertDate newConversion = new ConvertDate(SampleInputFromUser, 21);
DateTime answer = newConversion.Value;

Maintenant, je suis confus pour 'TimeZone'. Je ne sais pas comment l'utiliser pour obtenir les objectifs.
J'espère que vous comprenez ma question et avez l’idée de réaliser les objectifs. 

Modifier  

Selon la réponse @raveturned, j'obtiens le code suivant: 

*** Ajouté dans la méthode ConvertDate

TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById(GetFromConfig.ManilaTimeZoneKey());
ManilaTime = TimeZoneInfo.ConvertTime(dateTime.Value, TimeZoneInfo.Local, timeInfo).ToUniversalTime();

** Nouvelle propriété 

DateTime _ManilaTime;
public DateTime ManilaTime
{
    get { return _ManilaTime; }
    set { _ManilaTime = value; }
}
23
fiberOptics

Le framework .NET dispose déjà de classes et de méthodes pour convertir DateTimes entre différents fuseaux horaires. Consultez les méthodes ConvertTime de la classe TimeZoneInfo .

Edit: Lorsque vous avez l'heure de mettre dans la base de données, en supposant qu'elle a été créée avec les informations de fuseau horaire correctes, vous pouvez facilement convertir en UTC:

DateTime utcTime = inputDateTime.ToUniversalTime();

Récupère timeInfo comme dans l'édition de la question:

TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById(GetFromConfig.ManilaTimeZoneKey());

Lorsque vous envoyez l'heure de la base de données à l'utilisateur, convertissez-la dans le fuseau horaire approprié à l'aide de timeInfo.

DateTime userTime = TimeZoneInfo.ConvertTimeFromUtc(dbDateTime, timeInfo);

Personnellement, j'essayerais de garder cette logique séparée des méthodes get/set de propery.

51
raveturned
TimeZoneInfo infotime = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time (Mexico)");
DateTime thisDate = TimeZoneInfo.ConvertTimeFromUtc(datetimeFromBD, infotime);
5
Roger Tello

Aider les autres:

    static void ChangeTimezone()
    {
        // Timezone string here:
        foreach (TimeZoneInfo z in TimeZoneInfo.GetSystemTimeZones())
            Console.WriteLine(z.Id);

        // Use one of those timezone strings
        DateTime localDt = DateTime.Today;
        DateTime utcTime = localDt.ToUniversalTime();
        TimeZoneInfo timeInfo = TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time");
        DateTime estDt = TimeZoneInfo.ConvertTimeFromUtc(utcTime, timeInfo);
        return;
    }
0
user3761555
var date = System.TimeZoneInfo.ConvertTimeFromUtc(
    DateTime.UtcNow, 
    TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));
0
Kevin