System.TimeSpan yapısı

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

TimeSpan Nesne, bir saniyenin pozitif veya negatif gün, saat, dakika, saniye ve kesir sayısı olarak ölçülen bir zaman aralığını (süre veya geçen süre) temsil eder. Yapı TimeSpan , günün saatini temsil etmek için de kullanılabilir, ancak yalnızca saat belirli bir tarihle ilişkili değilse. Aksi takdirde, DateTime veya DateTimeOffset yapısı kullanılmalıdır. (Günün saatini yansıtmak için yapısını kullanma TimeSpan hakkında daha fazla bilgi için bkz . DateTime, DateTimeOffset, TimeSpan ve TimeZoneInfo Arasında Seçim Yapma.)

Not

Değer TimeSpan bir zaman aralığını temsil eder ve belirli sayıda gün, saat, dakika, saniye ve milisaniye olarak ifade edilebilir. Belirli bir başlangıç veya bitiş noktasına başvurmadan genel bir aralığı temsil ettiğinden, her ikisi de değişken sayıda güne sahip olan yıl ve ay cinsinden ifade edilemez. Belirli bir DateTime saat dilimine başvurmadan tarih ve saati temsil eden bir değerden veya belirli bir saat anını temsil eden bir DateTimeOffset değerden farklıdır.

Yapının süreyi ölçmek için kullandığı en büyük zaman TimeSpan birimi bir gündür. Aylar ve yıllar gibi daha büyük zaman birimlerindeki gün sayısı değiştiğinden, zaman aralıkları tutarlılık için gün cinsinden ölçülür.

Bir TimeSpan nesnenin değeri, temsil edilen zaman aralığına eşit olan onay işareti sayısıdır. Bir kene 100 nanosaniyeye veya saniyenin on milyonda birine eşittir. Bir TimeSpan nesnenin değeri ile TimeSpan.MinValueTimeSpan.MaxValuearasında değişebilir.

TimeSpan değerinin örneğini oluşturma

Bir değerin örneğini TimeSpan çeşitli yollarla oluşturabilirsiniz:

  • Örtük parametresiz oluşturucusunu çağırarak. Bu, aşağıdaki örnekte gösterildiği gibi değeri TimeSpan.Zeroolan bir nesne oluşturur.

    TimeSpan interval = new TimeSpan();
    Console.WriteLine(interval.Equals(TimeSpan.Zero));    // Displays "True".
    
    let interval = TimeSpan()
    printfn $"{interval.Equals TimeSpan.Zero}"    // Displays "True".
    
    Dim interval As New TimeSpan()
    Console.WriteLine(interval.Equals(TimeSpan.Zero))     ' Displays "True".
    
  • Açık oluşturucularından birini çağırarak. Aşağıdaki örnek belirtilen saat, dakika ve saniye sayısına kadar bir TimeSpan değer başlatır.

    TimeSpan interval = new TimeSpan(2, 14, 18);
    Console.WriteLine(interval.ToString());              
    
    // Displays "02:14:18".
    
    let interval = TimeSpan(2, 14, 18)
    printfn $"{interval}"              
    
    // Displays "02:14:18".
    
    Dim interval As New TimeSpan(2, 14, 18)
    Console.WriteLine(interval.ToString())                ' Displays "02:14:18".
    
  • Bir yöntemi çağırarak veya değer döndüren bir TimeSpan işlem gerçekleştirerek. Örneğin, aşağıdaki örnekte gösterildiği gibi iki tarih ve saat değeri arasındaki aralığı temsil eden bir TimeSpan değerin örneğini oluşturabilirsiniz.

    DateTime departure = new DateTime(2010, 6, 12, 18, 32, 0);
    DateTime arrival = new DateTime(2010, 6, 13, 22, 47, 0);
    TimeSpan travelTime = arrival - departure;  
    Console.WriteLine("{0} - {1} = {2}", arrival, departure, travelTime);      
    
    // The example displays the following output:
    //       6/13/2010 10:47:00 PM - 6/12/2010 6:32:00 PM = 1.04:15:00
    
    let departure = DateTime(2010, 6, 12, 18, 32, 0)
    let arrival = DateTime(2010, 6, 13, 22, 47, 0)
    let travelTime = arrival - departure  
    printfn $"{arrival} - {departure} = {travelTime}"
    
    // The example displays the following output:
    //       6/13/2010 10:47:00 PM - 6/12/2010 6:32:00 PM = 1.04:15:00
    
    Dim departure As DateTime = #06/12/2010 6:32PM#
    Dim arrival As DateTime = #06/13/2010 10:47PM#
    Dim travelTime As TimeSpan = arrival - departure
    Console.WriteLine("{0} - {1} = {2}", arrival, departure, travelTime)
    ' The example displays the following output:
    '       6/13/2010 10:47:00 PM - 6/12/2010 6:32:00 PM = 1.04:15:00
    

    Aşağıdaki örnekte gösterildiği gibi, bir nesneyi sıfır saat değerine bu şekilde de başlatabilirsiniz TimeSpan .

    Random rnd = new Random();
    
    TimeSpan timeSpent = TimeSpan.Zero;
    
    timeSpent += GetTimeBeforeLunch();
    timeSpent += GetTimeAfterLunch();
    
    Console.WriteLine("Total time: {0}", timeSpent);
    
    TimeSpan GetTimeBeforeLunch()
    {
        return new TimeSpan(rnd.Next(3, 6), 0, 0);
    }
    
    TimeSpan GetTimeAfterLunch()
    {
        return new TimeSpan(rnd.Next(3, 6), 0, 0);
    }
    
    // The example displays output like the following:
    //        Total time: 08:00:00
    
    open System
    
    let rnd = Random()
    
    let getTimeBeforeLunch () =
        TimeSpan(rnd.Next(3, 6), 0, 0)
    
    let getTimeAfterLunch() =
        TimeSpan(rnd.Next(3, 6), 0, 0)
    
    do
        let timeSpent = TimeSpan.Zero
    
        let timeSpent = timeSpent + getTimeBeforeLunch ()
        let timeSpent = timeSpent + getTimeAfterLunch ()
    
        printfn $"Total time: {timeSpent}"
    
    
    // The example displays output like the following:
    //        Total time: 08:00:00
    
    Module Example
       Dim rnd As New Random()
       
       Public Sub Main()
          Dim timeSpent As TimeSpan = TimeSpan.Zero
    
          timeSpent += GetTimeBeforeLunch()
          timeSpent += GetTimeAfterLunch()
    
          Console.WriteLine("Total time: {0}", timeSpent)
       End Sub
       
       Private Function GetTimeBeforeLunch() As TimeSpan
          Return New TimeSpan(rnd.Next(3, 6), 0, 0)
       End Function
       
       Private Function GetTimeAfterLunch() As TimeSpan
          Return New TimeSpan(rnd.Next(3, 6), 0, 0)
       End Function
    End Module
    ' The example displays output like the following:
    '       Total time: 08:00:00
    

    TimeSpandeğerleri, , DateTimeOffsetve yapılarının DateTimearitmetik işleçleri ve TimeSpan yöntemleri tarafından döndürülür.

  • Bir TimeSpan değerin dize gösterimini ayrıştırarak. zaman aralıkları içeren dizeleri değerlere dönüştürmek için TimeSpan ve TryParse yöntemlerini kullanabilirsinizParse. Aşağıdaki örnek, dize dizisini Parse değerlere dönüştürmek için TimeSpan yöntemini kullanır.

    string[] values = { "12", "31.", "5.8:32:16", "12:12:15.95", ".12"};
    foreach (string value in values)
    {
       try {
          TimeSpan ts = TimeSpan.Parse(value);
          Console.WriteLine("'{0}' --> {1}", value, ts);
       }
       catch (FormatException) {
          Console.WriteLine("Unable to parse '{0}'", value);
       }
       catch (OverflowException) {
          Console.WriteLine("'{0}' is outside the range of a TimeSpan.", value);
       }   
    }
    
    // The example displays the following output:
    //       '12' --> 12.00:00:00
    //       Unable to parse '31.'
    //       '5.8:32:16' --> 5.08:32:16
    //       '12:12:15.95' --> 12:12:15.9500000
    //       Unable to parse '.12'
    
    let values = [| "12"; "31."; "5.8:32:16"; "12:12:15.95"; ".12" |]
    for value in values do
        try
            let ts = TimeSpan.Parse value
            printfn $"'{value}' --> {ts}"
        with 
        | :? FormatException ->
            printfn $"Unable to parse '{value}'"
        | :? OverflowException ->
            printfn $"'{value}' is outside the range of a TimeSpan."
    
    // The example displays the following output:
    //       '12' --> 12.00:00:00
    //       Unable to parse '31.'
    //       '5.8:32:16' --> 5.08:32:16
    //       '12:12:15.95' --> 12:12:15.9500000
    //       Unable to parse '.12'
    
    Dim values() As String = {"12", "31.", "5.8:32:16", "12:12:15.95", ".12"}
    For Each value As String In values
        Try
            Dim ts As TimeSpan = TimeSpan.Parse(value)
            Console.WriteLine("'{0}' --> {1}", value, ts)
        Catch e As FormatException
            Console.WriteLine("Unable to parse '{0}'", value)
        Catch e As OverflowException
            Console.WriteLine("'{0}' is outside the range of a TimeSpan.", value)
        End Try
    Next
    ' The example displays the following output:
    '       '12' --> 12.00:00:00
    '       Unable to parse '31.'
    '       '5.8:32:16' --> 5.08:32:16
    '       '12:12:15.95' --> 12:12:15.9500000
    '       Unable to parse '.12'
    

    Ayrıca, veya TryParseExact yöntemini çağırarak ayrıştırılacak ve bir TimeSpan değere dönüştürülecek giriş dizesinin ParseExact tam biçimini tanımlayabilirsiniz.

TimeSpan değerlerinde işlem gerçekleştirme

ve işleçlerini kullanarak Addition veya ve SubtractionSubtract yöntemlerini çağırarak Add zaman sürelerini ekleyebilir ve çıkarabilirsiniz. ayrıca , CompareTove Equals yöntemlerini çağırarak Compareiki süreyi karşılaştırabilirsiniz. Yapı TimeSpan ayrıca zaman aralıklarını pozitif ve negatif değerlere dönüştüren ve Negate yöntemlerini de içerirDuration,

Değer aralığı TimeSpan olarak MaxValueayarlanırMinValue.

TimeSpan değerini biçimlendirme

Bir TimeSpan değer [-]d olarak gösterilebilir.ss:mm:ss.ff, burada isteğe bağlı eksi işareti negatif bir zaman aralığını gösterir, d bileşeni gün, ss 24 saatlik bir saatte ölçülen saat, mm dakika, ss saniye ve ff saniye kesirleridir. Başka bir ifadeyle, bir zaman aralığı, gün saati olmayan pozitif veya negatif gün sayısından, günün saati olan gün sayısından veya yalnızca günün saatinden oluşur.

.NET Framework 4'le başlayarak yapı, yönteminin TimeSpan aşırı yüklemeleri ToString aracılığıyla kültüre duyarlı biçimlendirmeyi destekler ve bu da bir TimeSpan değeri dize gösterimine dönüştürür. Varsayılan TimeSpan.ToString() yöntem, .NET Framework'ün önceki sürümlerindeki dönüş değeriyle aynı sabit bir biçim kullanarak bir zaman aralığı döndürür. Aşırı yükleme, TimeSpan.ToString(String) zaman aralığının dize gösterimini tanımlayan bir biçim dizesi belirtmenize olanak tanır. Aşırı yükleme, TimeSpan.ToString(String, IFormatProvider) bir biçim dizesi ve biçimlendirme kuralları zaman aralığının dize gösterimini oluşturmak için kullanılan kültürü belirtmenize olanak tanır. TimeSpan hem standart hem de özel biçim dizelerini destekler. (Daha fazla bilgi için bkz. Standart TimeSpan Biçim Dizeleri ve Özel TimeSpan Biçim Dizeleri.) Ancak, yalnızca standart biçim dizeleri kültüre duyarlıdır.

Eski TimeSpan biçimlendirmesini geri yükleme

Bazı durumlarda, .NET Framework 3.5 ve önceki sürümlerdeki değerleri başarıyla biçimlendiren TimeSpan kod .NET Framework 4'te başarısız olur. Bu, bir değeri biçim <dizesiyle biçimlendirmek TimeSpan için bir TimeSpan_LegacyFormatMode> öğesi yöntemini çağıran kodda en yaygın olanıdır. Aşağıdaki örnek,.NET Framework 3.5 ve önceki sürümlerde bir TimeSpan değeri başarıyla biçimlendirmektedir, ancak .NET Framework 4 ve sonraki sürümlerde bir özel durum oluşturur. .NET Framework 3.5 ve önceki sürümlerde yoksayılan desteklenmeyen bir biçim tanımlayıcısı kullanarak bir TimeSpan değeri biçimlendirmeye çalıştığına dikkat edin.

ShowFormattingCode();
// Output from .NET Framework 3.5 and earlier versions:
//       12:30:45
// Output from .NET Framework 4:
//       Invalid Format    

Console.WriteLine("---");

ShowParsingCode();
// Output:
//       000000006 --> 6.00:00:00

void ShowFormattingCode()
{
    TimeSpan interval = new TimeSpan(12, 30, 45);
    string output;
    try
    {
        output = String.Format("{0:r}", interval);
    }
    catch (FormatException)
    {
        output = "Invalid Format";
    }
    Console.WriteLine(output);
}

void ShowParsingCode()
{
    string value = "000000006";
    try
    {
        TimeSpan interval = TimeSpan.Parse(value);
        Console.WriteLine("{0} --> {1}", value, interval);
    }
    catch (FormatException)
    {
        Console.WriteLine("{0}: Bad Format", value);
    }
    catch (OverflowException)
    {
        Console.WriteLine("{0}: Overflow", value);
    }
}
let showFormattingCode () =
    let interval = TimeSpan(12, 30, 45)
    try
        $"{interval:r}"
    with :? FormatException ->
        "Invalid Format"
    |> printfn "%s"

let showParsingCode () =
    let value = "000000006"
    try
        let interval = TimeSpan.Parse value
        printfn $"{value} --> {interval}"
    with
    | :? FormatException ->
        printfn $"{value}: Bad Format"
    | :? OverflowException ->
        printfn $"{value}: Overflow"

showFormattingCode ()
// Output from .NET Framework 3.5 and earlier versions:
//       12:30:45
// Output from .NET Framework 4:
//       Invalid Format    

printfn "---"

showParsingCode ()
// Output:
//       000000006 --> 6.00:00:00
Dim interval As New TimeSpan(12, 30, 45)
Dim output As String
Try
    output = String.Format("{0:r}", interval)
Catch e As FormatException
    output = "Invalid Format"
End Try
Console.WriteLine(output)
' Output from .NET Framework 3.5 and earlier versions:
'       12:30:45
' Output from .NET Framework 4:
'       Invalid Format

Kodu değiştiremiyorsanız, değerlerin eski biçimlendirmesini TimeSpan aşağıdaki yollardan biriyle geri yükleyebilirsiniz:

  • TimeSpan_LegacyFormatMode> öğesini içeren <bir yapılandırma dosyası oluşturarak. Bu öğenin enabled özniteliğini uygulama başına eski TimeSpan biçimlendirmeyi geri yüklemek için true ayarlamak.

  • Uygulama etki alanı oluştururken "NetFx40_TimeSpanLegacyFormatMode" uyumluluk anahtarını ayarlayarak. Bu, uygulama başına etki alanı temelinde eski TimeSpan biçimlendirmeyi etkinleştirir. Aşağıdaki örnek, eski TimeSpan biçimlendirme kullanan bir uygulama etki alanı oluşturur.

    using System;
    
    public class Example2
    {
        public static void Main()
        {
            AppDomainSetup appSetup = new AppDomainSetup();
            appSetup.SetCompatibilitySwitches(new string[] { "NetFx40_TimeSpanLegacyFormatMode" });
            AppDomain legacyDomain = AppDomain.CreateDomain("legacyDomain",
                                                            null, appSetup);
            legacyDomain.ExecuteAssembly("ShowTimeSpan.exe");
        }
    }
    
    open System
    
    let appSetup = AppDomainSetup()
    appSetup.SetCompatibilitySwitches [| "NetFx40_TimeSpanLegacyFormatMode" |]
    let legacyDomain = AppDomain.CreateDomain("legacyDomain", null, appSetup)
    legacyDomain.ExecuteAssembly "ShowTimeSpan.exe" |> ignore
    
    Module Example3
        Public Sub Main()
            Dim appSetup As New AppDomainSetup()
            appSetup.SetCompatibilitySwitches({"NetFx40_TimeSpanLegacyFormatMode"})
            Dim legacyDomain As AppDomain = AppDomain.CreateDomain("legacyDomain",
                                                                 Nothing, appSetup)
            legacyDomain.ExecuteAssembly("ShowTimeSpan.exe")
        End Sub
    End Module
    

    Aşağıdaki kod yeni uygulama etki alanında yürütürse eski TimeSpan biçimlendirme davranışına geri döner.

    using System;
    
    public class Example3
    {
       public static void Main()
       {
          TimeSpan interval = DateTime.Now - DateTime.Now.Date;
          string msg = String.Format("Elapsed Time Today: {0:d} hours.",
                                     interval);
          Console.WriteLine(msg);
       }
    }
    // The example displays the following output:
    //       Elapsed Time Today: 01:40:52.2524662 hours.
    
    open System
    
    let interval = DateTime.Now - DateTime.Now.Date
    printfn $"Elapsed Time Today: {interval:d} hours."
    // The example displays the following output:
    //       Elapsed Time Today: 01:40:52.2524662 hours.
    
    Module Example4
        Public Sub Main()
            Dim interval As TimeSpan = Date.Now - Date.Now.Date
            Dim msg As String = String.Format("Elapsed Time Today: {0:d} hours.",
                                             interval)
            Console.WriteLine(msg)
        End Sub
    End Module
    ' The example displays output like the following:
    '       Elapsed Time Today: 01:40:52.2524662 hours.