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:
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; }
}
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.
TimeZoneInfo infotime = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time (Mexico)");
DateTime thisDate = TimeZoneInfo.ConvertTimeFromUtc(datetimeFromBD, infotime);
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;
}
var date = System.TimeZoneInfo.ConvertTimeFromUtc(
DateTime.UtcNow,
TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"));