Durchführen arithmetischer Datums- und UhrzeitoperationenPerforming arithmetic operations with dates and times

Obwohl sowohl DateTime die DateTimeOffset als auch die Strukturen Member bereitstellen, die arithmetische Operationen für ihre Werte ausführen, sind die Ergebnisse von arithmetischen Operationen sehr unterschiedlich.Although both the DateTime and the DateTimeOffset structures provide members that perform arithmetic operations on their values, the results of arithmetic operations are very different. In diesem Thema werden diese Unterschiede untersucht, sie mit graduierenden Zeitzonenbewusstseins in Datums- und Uhrzeitdaten verknüpft und erläutert, wie vollständig zeitzonenbewusste Vorgänge mithilfe von Datums- und Uhrzeitdaten ausgeführt werden können.This topic examines those differences, relates them to degrees of time zone awareness in date and time data, and discusses how to perform fully time zone aware operations using date and time data.

Vergleiche und arithmetische Operationen mit DateTime-WertenComparisons and arithmetic operations with DateTime values

Die DateTime.Kind Eigenschaft DateTimeKind ermöglicht es, dem Datum und der Uhrzeit einen Wert zuzuweisen, um anzugeben, ob er die Ortszeit, die koordinierte Weltzeit (UTC) oder die Zeit in einer nicht angegebenen Zeitzone darstellt.The DateTime.Kind property allows a DateTimeKind value to be assigned to the date and time to indicate whether it represents local time, Coordinated Universal Time (UTC), or the time in an unspecified time zone. Diese begrenzten Zeitzoneninformationen werden jedoch ignoriert, wenn Sie die DateTimeKind Datums- und Uhrzeitarithmetik für Werte vergleichen oder ausführen.However, this limited time zone information is ignored when comparing or performing date and time arithmetic on DateTimeKind values. Dies wird im folgenden Beispiel veranschaulicht, in dem die aktuelle lokale Zeit mit der aktuellen UTC-Zeit verglichen wird.The following example, which compares the current local time with the current UTC time, illustrates this.

using System;

public enum TimeComparison
{
   EarlierThan = -1,
   TheSameAs = 0,
   LaterThan = 1
}

public class DateManipulation
{
   public static void Main()
   {
      DateTime localTime = DateTime.Now;
      DateTime utcTime = DateTime.UtcNow;
      
      Console.WriteLine("Difference between {0} and {1} time: {2}:{3} hours", 
                        localTime.Kind.ToString(), 
                        utcTime.Kind.ToString(), 
                        (localTime - utcTime).Hours, 
                        (localTime - utcTime).Minutes);
      Console.WriteLine("The {0} time is {1} the {2} time.", 
                        localTime.Kind.ToString(), 
                        Enum.GetName(typeof(TimeComparison), localTime.CompareTo(utcTime)), 
                        utcTime.Kind.ToString());  
   }
}
// If run in the U.S. Pacific Standard Time zone, the example displays 
// the following output to the console:
//    Difference between Local and Utc time: -7:0 hours
//    The Local time is EarlierThan the Utc time.                                                    
Public Enum TimeComparison As Integer
   EarlierThan = -1
   TheSameAs = 0
   LaterThan = 1
End Enum

Module DateManipulation
   Public Sub Main()
      Dim localTime As Date = Date.Now
      Dim utcTime As Date = Date.UtcNow
      
      Console.WriteLine("Difference between {0} and {1} time: {2}:{3} hours", _
                        localTime.Kind.ToString(), _
                        utcTime.Kind.ToString(), _
                        (localTime - utcTime).Hours, _
                        (localTime - utcTime).Minutes)
      Console.WriteLine("The {0} time is {1} the {2} time.", _
                        localTime.Kind.ToString(), _ 
                        [Enum].GetName(GetType(TimeComparison), localTime.CompareTo(utcTime)), _
                        utcTime.Kind.ToString())  
      ' If run in the U.S. Pacific Standard Time zone, the example displays 
      ' the following output to the console:
      '    Difference between Local and Utc time: -7:0 hours
      '    The Local time is EarlierThan the Utc time.                                                    
   End Sub
End Module

Die CompareTo(DateTime) Methode meldet, dass die Ortszeit vor (oder weniger als) der UTC-Zeit liegt, und der Subtraktionsvorgang gibt an, dass der Unterschied zwischen UTC und der ortszeit für ein System in der Standardzeitzone des US-Pazifiks sieben Stunden beträgt.The CompareTo(DateTime) method reports that the local time is earlier than (or less than) the UTC time, and the subtraction operation indicates that the difference between UTC and the local time for a system in the U.S. Pacific Standard Time zone is seven hours. Da diese beiden Werte jedoch unterschiedliche Darstellungen eines einzelnen Zeitpunkts bieten, ist in diesem Fall klar, dass das Zeitintervall vollständig dem Offset der lokalen Zeitzone von UTC zuzurechnen ist.But because these two values provide different representations of a single point in time, it is clear in this case that the time interval is completely attributable to the local time zone's offset from UTC.

Im Allgemeinen DateTime.Kind wirkt sich die Eigenschaft Kind nicht auf die Ergebnisse aus, die durch Vergleichs- und arithmetische Methoden zurückgegeben werden (wie der Vergleich zweier identischer Zeitpunkte zeigt), obwohl sie die Interpretation dieser Ergebnisse beeinflussen kann.More generally, the DateTime.Kind property does not affect the results returned by Kind comparison and arithmetic methods (as the comparison of two identical points in time indicates), although it can affect the interpretation of those results. Zum Beispiel:For example:

  • Das Ergebnis einer arithmetischen Operation, die an DateTime.Kind zwei DateTimeKind Datums- und Uhrzeitwerten ausgeführt wird, deren Eigenschaften beide gleich sind, spiegelt das tatsächliche Zeitintervall zwischen den beiden Werten wider.The result of any arithmetic operation performed on two date and time values whose DateTime.Kind properties both equal DateTimeKind reflects the actual time interval between the two values. Entsprechend gibt der Vergleich zweier solcher Datums- und Zeitwerte genau die Beziehung zwischen den Zeiten wieder.Similarly, the comparison of two such date and time values accurately reflects the relationship between times.

  • Das Ergebnis eines arithmetischen oder Vergleichsvorgangs, DateTime.Kind der auf DateTimeKind zwei Datums- und DateTime.Kind Uhrzeitwerten ausgeführt wird, deren Eigenschaften sowohl gleich als auch auf zwei Datums- und Uhrzeitwerten mit unterschiedlichen Eigenschaftswerten sind, spiegelt die Differenz der Uhrzeit zwischen den beiden Werten wider.The result of any arithmetic or comparison operation performed on two date and time values whose DateTime.Kind properties both equal DateTimeKind or on two date and time values with different DateTime.Kind property values reflects the difference in clock time between the two values.

  • Bei arithmetischen oder Vergleichsoperationen für lokale Datums- und Uhrzeitwerte wird nicht berücksichtigt, ob ein bestimmter Wert mehrdeutig oder ungültig ist. Ebenso wenig werden die Auswirkungen von Anpassungsregeln berücksichtigt, die sich aus dem Übergang der lokalen Zeitzone zu oder von der Sommerzeit ergeben.Arithmetic or comparison operations on local date and time values do not consider whether a particular value is ambiguous or invalid, nor do they take account of the effect of any adjustment rules that result from the local time zone's transition to or from daylight saving time.

  • Jeder Vorgang, bei dem die Differenz zwischen UTC und einer lokalen Zeit verglichen oder berechnet wird, umfasst im Ergebnis ein Zeitintervall, das der Abweichung der lokalen Zeitzone von UTC entspricht.Any operation that compares or calculates the difference between UTC and a local time includes a time interval equal to the local time zone's offset from UTC in the result.

  • Jeder Vorgang, bei dem die Differenz zwischen einer nicht spezifizierten Uhrzeit und UTC oder der Ortszeit verglichen oder berechnet wird, gibt die einfache Uhrzeit wieder.Any operation that compares or calculates the difference between an unspecified time and either UTC or the local time reflects simple clock time. Zeitzonenunterschiede werden nicht berücksichtigt, und das Ergebnis gibt nicht die Anwendung der Regeln zur Zeitzonenanpassung wieder.Time zone differences are not considered, and the result does not reflect the application of time zone adjustment rules.

  • Jeder Vorgang, bei dem die Differenz zwischen zwei nicht spezifizierten Zeiten verglichen oder berechnet wird, kann ein unbekanntes Intervall umfassen, das den Unterschied zwischen den Zeiten in zwei verschiedenen Zeitzonen wiedergibt.Any operation that compares or calculates the difference between two unspecified times may include an unknown interval that reflects the difference between the time in two different time zones.

Es gibt viele Szenarien, in denen Zeitzonenunterschiede sich nicht auf Datums- und Uhrzeitberechnungen auswirken (für eine Diskussion einiger dieser Szenarien finden Sie unter Auswählen zwischen DateTime, DateTimeOffset, TimeSpan und TimeZoneInfo) oder in denen der Kontext der Datums- und Uhrzeitdaten die Bedeutung von Vergleichs- oder Arithmetikvorgängen definiert.There are many scenarios in which time zone differences do not affect date and time calculations (for a discussion of some of these, see Choosing between DateTime, DateTimeOffset, TimeSpan, and TimeZoneInfo) or in which the context of the date and time data defines the meaning of comparison or arithmetic operations.

Vergleiche und arithmetische Operationen mit DateTimeOffset-WertenComparisons and arithmetic operations with DateTimeOffset values

Ein DateTimeOffset Wert enthält nicht nur ein Datum und eine Uhrzeit, sondern auch einen Offset, der dieses Datum und die Uhrzeit im Verhältnis zu UTC eindeutig definiert.A DateTimeOffset value includes not only a date and time, but also an offset that unambiguously defines that date and time relative to UTC. Dadurch ist es möglich, Gleichheit DateTimeOffset etwas anders zu definieren als für Werte.This makes it possible to define equality somewhat differently than for DateTimeOffset values. Während DateTime Werte gleich sind, wenn sie den DateTimeOffset gleichen Datums- und Uhrzeitwert haben, sind Werte gleich, wenn sie beide auf denselben Zeitpunkt verweisen.Whereas DateTime values are equal if they have the same date and time value, DateTimeOffset values are equal if they both refer to the same point in time. Dies DateTimeOffset macht einen Wert genauer und weniger interpretierbar, wenn er in Vergleichen und in den meisten arithmetischen Operationen verwendet wird, die das Intervall zwischen zwei Datums- und Uhrzeitangaben bestimmen.This makes a DateTimeOffset value more accurate and less in need of interpretation when used in comparisons and in most arithmetic operations that determine the interval between two dates and times. Das folgende Beispiel, DateTimeOffset das dem vorherigen Beispiel entspricht, DateTimeOffset in dem lokale und UTC-Werte verglichen wurden, veranschaulicht diesen Verhaltensunterschied.The following example, which is the DateTimeOffset equivalent to the previous example that compared local and UTC DateTimeOffset values, illustrates this difference in behavior.

using System;

public enum TimeComparison
{
   EarlierThan = -1,
   TheSameAs = 0,
   LaterThan = 1
}

public class DateTimeOffsetManipulation
{
   public static void Main()
   {
      DateTimeOffset localTime = DateTimeOffset.Now;
      DateTimeOffset utcTime = DateTimeOffset.UtcNow;
      
      Console.WriteLine("Difference between local time and UTC: {0}:{1:D2} hours", 
                        (localTime - utcTime).Hours, 
                        (localTime - utcTime).Minutes);
      Console.WriteLine("The local time is {0} UTC.", 
                        Enum.GetName(typeof(TimeComparison), localTime.CompareTo(utcTime)));  
   }
}
// Regardless of the local time zone, the example displays 
// the following output to the console:
//    Difference between local time and UTC: 0:00 hours.
//    The local time is TheSameAs UTC.
Public Enum TimeComparison As Integer
   EarlierThan = -1
   TheSameAs = 0
   LaterThan = 1
End Enum

Module DateTimeOffsetManipulation
   Public Sub Main()
      Dim localTime As DateTimeOffset = DateTimeOffset.Now
      Dim utcTime As DateTimeOffset = DateTimeOffset.UtcNow
      
      Console.WriteLine("Difference between local time and UTC: {0}:{1:D2} hours.", _
                        (localTime - utcTime).Hours, _
                        (localTime - utcTime).Minutes)
      Console.WriteLine("The local time is {0} UTC.", _
                        [Enum].GetName(GetType(TimeComparison), localTime.CompareTo(utcTime)))  
   End Sub
End Module
' Regardless of the local time zone, the example displays 
' the following output to the console:
'    Difference between local time and UTC: 0:00 hours.
'    The local time is TheSameAs UTC.
'          Console.WriteLine(e.GetType().Name)

In diesem Beispiel CompareTo gibt die Methode an, dass die aktuelle Ortszeit und CompareTo(DateTimeOffset) die aktuelle UTC-Zeit gleich TimeSpan.Zerosind, und die Subtraktion von Werten gibt an, dass die Differenz zwischen den beiden Zeiten ist .In this example, the CompareTo method indicates that the current local time and the current UTC time are equal, and subtraction of CompareTo(DateTimeOffset) values indicates that the difference between the two times is TimeSpan.Zero.

Die Hauptbeschränkung DateTimeOffset für die Verwendung von Werten in DateTimeOffset der Datums- und Uhrzeitarithmetik besteht darin, dass Werte zwar eine gewisse Zeitzonen-Bewusstheit aufweisen, aber nicht vollständig Zeitzonen-bewusst sind.The chief limitation of using DateTimeOffset values in date and time arithmetic is that although DateTimeOffset values have some time zone awareness, they are not fully time zone aware. Obwohl DateTimeOffset der Offset des Werts den Offset einer Zeitzone von UTC widerspiegelt, wenn einer DateTimeOffset Variablen zuerst ein Wert zugewiesen wird, wird er danach von der Zeitzone getrennt.Although the DateTimeOffset value's offset reflects a time zone's offset from UTC when a DateTimeOffset variable is first assigned a value, it becomes disassociated from the time zone thereafter. Da er nicht mehr direkt einer identifizierbaren Zeit zugeordnet ist, werden bei der Addition und Subtraktion von Datums- und Uhrzeitintervallen keine Regeln zur Zeitzonenanpassung berücksichtigt.Because it is no longer directly associated with an identifiable time, the addition and subtraction of date and time intervals does not consider a time zone's adjustment rules.

Zur Veranschaulichung erfolgt der Übergang zur Sommerzeit in der zentralen Standardzeitzone der USA um 2:00 Uhr.To illustrate, the transition to daylight saving time in the U.S. Central Standard Time zone occurs at 2:00 A.M. am 9. März 2008 hinzugefügt wurden.on March 9, 2008. Demnach sollten sich durch das Hinzufügen eines Intervalls von 2,5 Stunden zur Central Standard Time um 1:30 UhrThis means that adding a two and a half hour interval to a Central Standard time of 1:30 A.M. am 9. März 2008 ein Datum und eine Uhrzeit von 5:00 Uhr morgenson March 9, 2008, should produce a date and time of 5:00 A.M. am 9. März 2008 hinzugefügt wurden.on March 9, 2008. Wie das folgende Beispiel zeigt, ist das Ergebnis der Addition jedoch 4:00 Uhr morgensHowever, as the following example shows, the result of the addition is 4:00 A.M. am 9. März 2008 hinzugefügt wurden.on March 9, 2008. Beachten Sie, dass das Ergebnis dieses Vorgangs den richtigen Zeitpunkt darstellt, obwohl es nicht die Zeit in der Zeitzone ist, an der wir interessiert sind (d. h., es hat nicht den erwarteten Zeitzonenversatz).Note that the result of this operation does represent the correct point in time, although it is not the time in the time zone in which we are interested (that is, it does not have the expected time zone offset).

using System;

public class IntervalArithmetic
{
   public static void Main()
   {
      DateTime generalTime = new DateTime(2008, 3, 9, 1, 30, 0);
      const string tzName = "Central Standard Time";
      TimeSpan twoAndAHalfHours = new TimeSpan(2, 30, 0);

      // Instantiate DateTimeOffset value to have correct CST offset
      try
      {
         DateTimeOffset centralTime1 = new DateTimeOffset(generalTime, 
                    TimeZoneInfo.FindSystemTimeZoneById(tzName).GetUtcOffset(generalTime));
      
         // Add two and a half hours      
         DateTimeOffset centralTime2 = centralTime1.Add(twoAndAHalfHours);
         // Display result
         Console.WriteLine("{0} + {1} hours = {2}", centralTime1, 
                                                    twoAndAHalfHours.ToString(), 
                                                    centralTime2);  
      }
      catch (TimeZoneNotFoundException)
      {
         Console.WriteLine("Unable to retrieve Central Standard Time zone information.");
      }
   }
}
// The example displays the following output to the console:
//    3/9/2008 1:30:00 AM -06:00 + 02:30:00 hours = 3/9/2008 4:00:00 AM -06:00
Module IntervalArithmetic
   Public Sub Main()
      Dim generalTime As Date = #03/09/2008 1:30AM#
      Const tzName As String = "Central Standard Time"
      Dim twoAndAHalfHours As New TimeSpan(2, 30, 0)

      ' Instantiate DateTimeOffset value to have correct CST offset
      Try
         Dim centralTime1 As New DateTimeOffset(generalTime, _
                    TimeZoneInfo.FindSystemTimeZoneById(tzName).GetUtcOffset(generalTime))
      
         ' Add two and a half hours      
         Dim centralTime2 As DateTimeOffset = centralTime1.Add(twoAndAHalfHours)
         ' Display result
         Console.WriteLine("{0} + {1} hours = {2}", centralTime1, _
                                                    twoAndAHalfHours.ToString(), _
                                                    centralTime2)   
      Catch e As TimeZoneNotFoundException
         Console.WriteLine("Unable to retrieve Central Standard Time zone information.")
      End Try
   End Sub
End Module
' The example displays the following output to the console:
'    3/9/2008 1:30:00 AM -06:00 + 02:30:00 hours = 3/9/2008 4:00:00 AM -06:00

Arithmetische Operationen mit Zeiten in ZeitzonenArithmetic operations with times in time zones

Die TimeZoneInfo Klasse enthält eine Reihe von Konvertierungsmethoden, die automatisch Anpassungen anwenden, wenn sie Zeiten von einer Zeitzone in eine andere konvertieren.The TimeZoneInfo class includes a number of conversion methods that automatically apply adjustments when they convert times from one time zone to another. Dabei handelt es sich z. B. um:These include the following:

Weitere Informationen finden Sie unter Konvertieren von Zeiten zwischen Zeitzonen.For details, see Converting times between time zones.

Die TimeZoneInfo Klasse stellt keine Methoden bereit, die beim Ausführen der Datums- und Uhrzeitarithmetik automatisch Anpassungsregeln anwenden.The TimeZoneInfo class does not provide any methods that automatically apply adjustment rules when you perform date and time arithmetic. Sie können zu diesem Zweck jedoch die Uhrzeit einer Zeitzone in UTC konvertieren, die arithmetische Operation durchführen und die Uhrzeit dann wieder in die Zeit der Zeitzone zurückkonvertieren.However, you can do this by converting the time in a time zone to UTC, performing the arithmetic operation, and then converting from UTC back to the time in the time zone. Weitere Informationen finden Sie unter Gewusst wie: Verwenden von Zeitzonen in der Datums- und Uhrzeitarithmetik.For details, see How to: Use time zones in date and time arithmetic.

Beispielsweise ähnelt der folgende Code dem vorherigen Code, bei dem 2,5 Stunden zu 2:00 UhrFor example, the following code is similar to the previous code that added two-and-a-half hours to 2:00 A.M. am 9. März 2008 hinzugefügt wurden.on March 9, 2008. Da jedoch vor dem Ausführen von Datums- und Uhrzeitoperationen die Central Standard Time in UTC konvertiert und das Ergebnis dann von UTC zurück in Central Standard Time zurückkonvertiert wird, gibt die Ergebniszeit den Übergang von der Zeitzone Central Standard Time zur Sommerzeit wieder.However, because it converts a Central Standard time to UTC before it performs date and time arithmetic, and then converts the result from UTC back to Central Standard time, the resulting time reflects the Central Standard Time Zone's transition to daylight saving time.

using System;

public class TimeZoneAwareArithmetic
{
   public static void Main()
   {
      const string tzName = "Central Standard Time";
      
      DateTime generalTime = new DateTime(2008, 3, 9, 1, 30, 0);
      TimeZoneInfo cst = TimeZoneInfo.FindSystemTimeZoneById(tzName);
      TimeSpan twoAndAHalfHours = new TimeSpan(2, 30, 0);

      // Instantiate DateTimeOffset value to have correct CST offset
      try
      {
         DateTimeOffset centralTime1 = new DateTimeOffset(generalTime, 
                                       cst.GetUtcOffset(generalTime));
      
         // Add two and a half hours
         DateTimeOffset utcTime = centralTime1.ToUniversalTime();
         utcTime += twoAndAHalfHours;
               
         DateTimeOffset centralTime2 = TimeZoneInfo.ConvertTime(utcTime, cst);
         // Display result
         Console.WriteLine("{0} + {1} hours = {2}", centralTime1, 
                                                    twoAndAHalfHours.ToString(), 
                                                    centralTime2);  
      }
      catch (TimeZoneNotFoundException)
      {
         Console.WriteLine("Unable to retrieve Central Standard Time zone information.");
      }
   }
}
// The example displays the following output to the console:
//    3/9/2008 1:30:00 AM -06:00 + 02:30:00 hours = 3/9/2008 5:00:00 AM -05:00
Module TimeZoneAwareArithmetic
   Public Sub Main()
      Const tzName As String = "Central Standard Time"
      
      Dim generalTime As Date = #03/09/2008 1:30AM#
      Dim cst As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(tzName) 
      Dim twoAndAHalfHours As New TimeSpan(2, 30, 0)

      ' Instantiate DateTimeOffset value to have correct CST offset
      Try
         Dim centralTime1 As New DateTimeOffset(generalTime, _
                    cst.GetUtcOffset(generalTime))
      
         ' Add two and a half hours 
         Dim utcTime As DateTimeOffset = centralTime1.ToUniversalTime()
         utcTime += twoAndAHalfHours
         
         Dim centralTime2 As DateTimeOffset = TimeZoneInfo.ConvertTime(utcTime, cst)
         ' Display result
         Console.WriteLine("{0} + {1} hours = {2}", centralTime1, _
                                                    twoAndAHalfHours.ToString(), _
                                                    centralTime2)   
      Catch e As TimeZoneNotFoundException
         Console.WriteLine("Unable to retrieve Central Standard Time zone information.")
      End Try
   End Sub
End Module
' The example displays the following output to the console:
'    3/9/2008 1:30:00 AM -06:00 + 02:30:00 hours = 3/9/2008 5:00:00 AM -05:00

Siehe auchSee also