Windows 日期时间 - C# 示例

Windows平台C#日期时间处理示例,包括DateTime、TimeSpan、TimeZone和日历操作

💻 获取当前日期和时间 csharp

🟢 simple

在C#中获取当前日期、时间和进行基本时间计算的各种方法

⏱️ 15 min 🏷️ csharp, datetime, time, windows
Prerequisites: Basic C# syntax, Understanding of date/time concepts
using System;
using System.Globalization;

class CurrentTime
{
    // 1. Basic current time operations
    public static void BasicCurrentTime()
    {
        Console.WriteLine("=== Basic Current Time Operations ===");

        // Get current date and time
        DateTime now = DateTime.Now;
        Console.WriteLine($"DateTime.Now: {now}");
        Console.WriteLine($"Date part: {now.Date}");
        Console.WriteLine($"Time of day: {now.TimeOfDay}");

        // Get UTC time
        DateTime utcNow = DateTime.UtcNow;
        Console.WriteLine($"\nDateTime.UtcNow: {utcNow}");

        // Get current date only
        DateTime today = DateTime.Today;
        Console.WriteLine($"DateTime.Today: {today}");

        // Get ticks (100-nanosecond intervals since 1/1/0001)
        long ticks = DateTime.Now.Ticks;
        Console.WriteLine($"\nTicks: {ticks:N0}");
        Console.WriteLine($"Ticks since 1/1/0001: {TimeSpan.FromTicks(ticks).TotalDays:F0} days");
    }

    // 2. DateTime components
    public static void DateTimeComponents()
    {
        Console.WriteLine("\n=== DateTime Components ===");

        DateTime now = DateTime.Now;

        Console.WriteLine($"Year: {now.Year}");
        Console.WriteLine($"Month: {now.Month} ({now.ToString("MMMM")})");
        Console.WriteLine($"Day: {now.Day}");
        Console.WriteLine($"Hour: {now.Hour}");
        Console.WriteLine($"Minute: {now.Minute}");
        Console.WriteLine($"Second: {now.Second}");
        Console.WriteLine($"Millisecond: {now.Millisecond}");

        // Day of week and day of year
        Console.WriteLine($"\nDay of Week: {now.DayOfWeek} ({(int)now.DayOfWeek})");
        Console.WriteLine($"Day of Year: {now.DayOfYear}");

        // Time of day
        Console.WriteLine($"\nTime of Day: {now.TimeOfDay}");
        Console.WriteLine($"Total hours since midnight: {now.TimeOfDay.TotalHours:F2}");
        Console.WriteLine($"Total minutes since midnight: {now.TimeOfDay.TotalMinutes:F0}");
    }

    // 3. DateTime creation
    public static void DateTimeCreation()
    {
        Console.WriteLine("\n=== DateTime Creation ===");

        // Create specific DateTime
        DateTime specificDate = new DateTime(2024, 12, 25);
        Console.WriteLine($"Specific date: {specificDate:yyyy-MM-dd}");

        // Create DateTime with time
        DateTime specificDateTime = new DateTime(2024, 12, 25, 14, 30, 45);
        Console.WriteLine($"Specific datetime: {specificDateTime:yyyy-MM-dd HH:mm:ss}");

        // Create with milliseconds
        DateTime withMilliseconds = new DateTime(2024, 12, 25, 14, 30, 45, 123);
        Console.WriteLine($"With milliseconds: {withMilliseconds:yyyy-MM-dd HH:mm:ss.fff}");

        // Create from string
        DateTime fromString = DateTime.Parse("2024-12-25 14:30:45");
        Console.WriteLine($"From string: {fromString:yyyy-MM-dd HH:mm:ss}");

        // Create with specific format
        DateTime withFormat = DateTime.ParseExact("25/12/2024", "dd/MM/yyyy", CultureInfo.InvariantCulture);
        Console.WriteLine($"With format: {withFormat:yyyy-MM-dd}");

        // Create from ticks
        long customTicks = new DateTime(2024, 1, 1).Ticks;
        DateTime fromTicks = new DateTime(customTicks);
        Console.WriteLine($"From ticks: {fromTicks:yyyy-MM-dd}");
    }

    // 4. Date and time arithmetic
    public static void DateTimeArithmetic()
    {
        Console.WriteLine("\n=== Date and Time Arithmetic ===");

        DateTime baseDate = new DateTime(2024, 1, 1, 12, 0, 0);
        Console.WriteLine($"Base date: {baseDate:yyyy-MM-dd HH:mm:ss}");

        // Adding time
        DateTime plusDays = baseDate.AddDays(10);
        DateTime plusHours = baseDate.AddHours(5);
        DateTime plusMinutes = baseDate.AddMinutes(30);
        DateTime plusSeconds = baseDate.AddSeconds(45);
        DateTime plusMonths = baseDate.AddMonths(2);
        DateTime plusYears = baseDate.AddYears(1);

        Console.WriteLine($"\nAdd 10 days: {plusDays:yyyy-MM-dd HH:mm:ss}");
        Console.WriteLine($"Add 5 hours: {plusHours:yyyy-MM-dd HH:mm:ss}");
        Console.WriteLine($"Add 30 minutes: {plusMinutes:yyyy-MM-dd HH:mm:ss}");
        Console.WriteLine($"Add 45 seconds: {plusSeconds:yyyy-MM-dd HH:mm:ss}");
        Console.WriteLine($"Add 2 months: {plusMonths:yyyy-MM-dd HH:mm:ss}");
        Console.WriteLine($"Add 1 year: {plusYears:yyyy-MM-dd HH:mm:ss}");

        // Subtracting time
        DateTime subtracted = baseDate.Subtract(TimeSpan.FromDays(7));
        Console.WriteLine($"\nSubtract 7 days: {subtracted:yyyy-MM-dd HH:mm:ss}");

        // Calculate difference
        DateTime otherDate = new DateTime(2024, 1, 15, 18, 30, 0);
        TimeSpan difference = otherDate - baseDate;
        Console.WriteLine($"\nDifference between {otherDate:yyyy-MM-dd HH:mm:ss} and {baseDate:yyyy-MM-dd HH:mm:ss}:");
        Console.WriteLine($"Total days: {difference.TotalDays}");
        Console.WriteLine($"Total hours: {difference.TotalHours}");
        Console.WriteLine($"Total minutes: {difference.TotalMinutes}");
    }

    // 5. TimeSpan operations
    public static void TimeSpanOperations()
    {
        Console.WriteLine("\n=== TimeSpan Operations ===");

        // Create TimeSpan
        TimeSpan ts1 = new TimeSpan(1, 30, 45);  // 1 hour, 30 minutes, 45 seconds
        TimeSpan ts2 = TimeSpan.FromDays(2.5);     // 2.5 days
        TimeSpan ts3 = TimeSpan.Parse("01:45:30"); // Parse from string

        Console.WriteLine($"TimeSpan 1: {ts1}");
        Console.WriteLine($"TimeSpan 2: {ts2}");
        Console.WriteLine($"TimeSpan 3: {ts3}");

        // TimeSpan components
        Console.WriteLine("\nTimeSpan 1 components:");
        Console.WriteLine($"Days: {ts1.Days}");
        Console.WriteLine($"Hours: {ts1.Hours}");
        Console.WriteLine($"Minutes: {ts1.Minutes}");
        Console.WriteLine($"Seconds: {ts1.Seconds}");
        Console.WriteLine($"TotalDays: {ts1.TotalDays:F2}");
        Console.WriteLine($"TotalHours: {ts1.TotalHours:F2}");
        Console.WriteLine($"TotalMinutes: {ts1.TotalMinutes:F2}");
        Console.WriteLine($"TotalSeconds: {ts1.TotalSeconds:F0}");

        // TimeSpan arithmetic
        TimeSpan sum = ts1 + ts3;
        TimeSpan difference = ts2 - ts1;
        TimeSpan doubled = ts1 * 2;
        TimeSpan halved = ts1 / 2;

        Console.WriteLine($"\nTimeSpan arithmetic:");
        Console.WriteLine($"ts1 + ts3 = {sum}");
        Console.WriteLine($"ts2 - ts1 = {difference}");
        Console.WriteLine($"ts1 * 2 = {doubled}");
        Console.WriteLine($"ts1 / 2 = {halved}");

        // TimeSpan formatting
        Console.WriteLine($"\nFormatted TimeSpan:");
        Console.WriteLine($"General format: {ts1}");
        Console.WriteLine(@"hh:mm:ss: {ts1:hh\:mm\:ss}");
        Console.WriteLine(@"g format: {ts1:g}");
        Console.WriteLine(@"G format: {ts1:G}");
    }

    // 6. Date comparison
    public static void DateComparison()
    {
        Console.WriteLine("\n=== Date Comparison ===");

        DateTime date1 = new DateTime(2024, 12, 25);
        DateTime date2 = new DateTime(2024, 12, 25);
        DateTime date3 = new DateTime(2024, 12, 26);

        Console.WriteLine($"date1: {date1:yyyy-MM-dd}");
        Console.WriteLine($"date2: {date2:yyyy-MM-dd}");
        Console.WriteLine($"date3: {date3:yyyy-MM-dd}");

        // Equality comparison
        Console.WriteLine($"\nEquality:");
        Console.WriteLine($"date1 == date2: {date1 == date2}");
        Console.WriteLine($"date1 == date3: {date1 == date3}");
        Console.WriteLine($"date1.Equals(date2): {date1.Equals(date2)}");

        // Relational comparison
        Console.WriteLine("\nRelational:");
        Console.WriteLine($"date1 < date3: {date1 < date3}");
        Console.WriteLine($"date1 > date3: {date1 > date3}");
        Console.WriteLine($"date1 <= date2: {date1 <= date2}");
        Console.WriteLine($"date1 >= date2: {date1 >= date2}");

        // Compare method
        Console.WriteLine("\nCompare method:");
        Console.WriteLine($"date1.CompareTo(date2): {date1.CompareTo(date2)}");  // 0 = equal
        Console.WriteLine($"date1.CompareTo(date3): {date1.CompareTo(date3)}");  // -1 = less than
        Console.WriteLine($"date3.CompareTo(date1): {date3.CompareTo(date1)}");  // 1 = greater than

        // Static comparison methods
        Console.WriteLine("\nStatic comparison:");
        Console.WriteLine($"DateTime.Equals(date1, date2): {DateTime.Equals(date1, date2)}");
        Console.WriteLine($"DateTime.Compare(date1, date2): {DateTime.Compare(date1, date2)}");
        Console.WriteLine($"DateTime.Compare(date1, date3): {DateTime.Compare(date1, date3)}");
    }

    // 7. Maximum and minimum dates
    public static void MinMaxDates()
    {
        Console.WriteLine("\n=== Minimum and Maximum Dates ===");

        Console.WriteLine($"DateTime.MinValue: {DateTime.MinValue}");
        Console.WriteLine($"DateTime.MaxValue: {DateTime.MaxValue}");
        Console.WriteLine($"TimeSpan.MinValue: {TimeSpan.MinValue}");
        Console.WriteLine($"TimeSpan.MaxValue: {TimeSpan.MaxValue}");

        // Age calculation
        DateTime birthDate = new DateTime(1990, 5, 15);
        DateTime today = DateTime.Today;
        int age = today.Year - birthDate.Year;
        if (birthDate > today.AddYears(-age))
        {
            age--;
        }

        Console.WriteLine($"\nAge calculation:");
        Console.WriteLine($"Birth date: {birthDate:yyyy-MM-dd}");
        Console.WriteLine($"Today: {today:yyyy-MM-dd}");
        Console.WriteLine($"Age: {age} years");

        // Days until next birthday
        DateTime nextBirthday = new DateTime(today.Year, birthDate.Month, birthDate.Day);
        if (nextBirthday < today)
        {
            nextBirthday = nextBirthday.AddYears(1);
        }

        TimeSpan untilBirthday = nextBirthday - today;
        Console.WriteLine($"Days until next birthday: {untilBirthday.Days}");
    }

    // 8. Date validation and parsing
    public static void DateValidationAndParsing()
    {
        Console.WriteLine("\n=== Date Validation and Parsing ===");

        string[] dateStrings = {
            "2024-12-25",
            "25/12/2024",
            "December 25, 2024",
            "2024-12-25 14:30:45",
            "invalid date",
            "31/02/2024",  // Invalid February date
            "2024-13-01"    // Invalid month
        };

        Console.WriteLine("Date parsing attempts:");
        foreach (string dateStr in dateStrings)
        {
            Console.WriteLine($"\nTrying to parse: '{dateStr}'");

            // TryParse
            if (DateTime.TryParse(dateStr, out DateTime parsedDate))
            {
                Console.WriteLine($"  TryParse success: {parsedDate:yyyy-MM-dd HH:mm:ss}");
            }
            else
            {
                Console.WriteLine($"  TryParse failed");
            }

            // TryParse with specific culture
            if (DateTime.TryParse(dateStr, CultureInfo.GetCultureInfo("en-GB"), DateTimeStyles.None, out DateTime ukDate))
            {
                Console.WriteLine($"  UK format success: {ukDate:yyyy-MM-dd HH:mm:ss}");
            }

            // TryParseExact
            string[] formats = { "yyyy-MM-dd", "dd/MM/yyyy", "MMMM dd, yyyy", "yyyy-MM-dd HH:mm:ss" };
            if (DateTime.TryParseExact(dateStr, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime exactDate))
            {
                Console.WriteLine($"  TryParseExact success: {exactDate:yyyy-MM-dd HH:mm:ss}");
            }
        }
    }

    // 9. Performance considerations
    public static void PerformanceConsiderations()
    {
        Console.WriteLine("\n=== Performance Considerations ===");

        const int iterations = 100000;
        var stopwatch = System.Diagnostics.Stopwatch.StartNew();

        // Test DateTime.Now vs DateTime.UtcNow
        stopwatch.Restart();
        for (int i = 0; i < iterations; i++)
        {
            DateTime local = DateTime.Now;
        }
        stopwatch.Stop();
        Console.WriteLine($"DateTime.Now x {iterations:N0}: {stopwatch.ElapsedMilliseconds}ms");

        stopwatch.Restart();
        for (int i = 0; i < iterations; i++)
        {
            DateTime utc = DateTime.UtcNow;
        }
        stopwatch.Stop();
        Console.WriteLine($"DateTime.UtcNow x {iterations:N0}: {stopwatch.ElapsedMilliseconds}ms");

        // Test DateTime creation
        stopwatch.Restart();
        for (int i = 0; i < iterations; i++)
        {
            DateTime created = new DateTime(2024, 1, 1, 12, 0, 0);
        }
        stopwatch.Stop();
        Console.WriteLine($"DateTime constructor x {iterations:N0}: {stopwatch.ElapsedMilliseconds}ms");

        // Test date comparison
        DateTime date1 = new DateTime(2024, 1, 1);
        DateTime date2 = new DateTime(2024, 1, 2);

        stopwatch.Restart();
        for (int i = 0; i < iterations; i++)
        {
            bool isEqual = date1 == date2;
            bool isLess = date1 < date2;
            int compare = date1.CompareTo(date2);
        }
        stopwatch.Stop();
        Console.WriteLine($"Date comparisons x {iterations:N0}: {stopwatch.ElapsedMilliseconds}ms");
    }

    // 10. Real-world examples
    public static void RealWorldExamples()
    {
        Console.WriteLine("\n=== Real-world Examples ===");

        // Example 1: Working days calculation
        DateTime startDate = new DateTime(2024, 1, 1);
        DateTime endDate = new DateTime(2024, 1, 31);
        int workingDays = CalculateWorkingDays(startDate, endDate);

        Console.WriteLine($"Working days between {startDate:yyyy-MM-dd} and {endDate:yyyy-MM-dd}: {workingDays}");

        // Example 2: Find next occurrence of day of week
        DateTime nextMonday = FindNextDayOfWeek(DateTime.Today, DayOfWeek.Monday);
        Console.WriteLine($"Next Monday: {nextMonday:yyyy-MM-dd}");

        // Example 3: First and last day of month
        DateTime today = DateTime.Today;
        DateTime firstDayOfMonth = new DateTime(today.Year, today.Month, 1);
        DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);

        Console.WriteLine($"\nToday: {today:yyyy-MM-dd}");
        Console.WriteLine($"First day of month: {firstDayOfMonth:yyyy-MM-dd}");
        Console.WriteLine($"Last day of month: {lastDayOfMonth:yyyy-MM-dd}");

        // Example 4: Quarter information
        int quarter = (today.Month - 1) / 3 + 1;
        DateTime quarterStart = new DateTime(today.Year, (quarter - 1) * 3 + 1, 1);
        DateTime quarterEnd = quarterStart.AddMonths(3).AddDays(-1);

        Console.WriteLine($"\nCurrent quarter: Q{quarter}");
        Console.WriteLine($"Quarter start: {quarterStart:yyyy-MM-dd}");
        Console.WriteLine($"Quarter end: {quarterEnd:yyyy-MM-dd}");

        // Example 5: Time until end of day/year
        DateTime endOfDay = today.AddDays(1).AddTicks(-1);
        DateTime endOfYear = new DateTime(today.Year, 12, 31, 23, 59, 59);

        TimeSpan untilEndOfDay = endOfDay - DateTime.Now;
        TimeSpan untilEndOfYear = endOfYear - DateTime.Now;

        Console.WriteLine($"\nTime until end of day: {untilEndOfDay.Hours}h {untilEndOfDay.Minutes}m");
        Console.WriteLine($"Time until end of year: {untilEndOfYear.Days} days {untilEndOfYear.Hours}h");
    }

    // Helper methods for real-world examples
    static int CalculateWorkingDays(DateTime start, DateTime end)
    {
        int days = 0;
        DateTime current = start;

        while (current <= end)
        {
            if (current.DayOfWeek != DayOfWeek.Saturday && current.DayOfWeek != DayOfWeek.Sunday)
            {
                days++;
            }
            current = current.AddDays(1);
        }

        return days;
    }

    static DateTime FindNextDayOfWeek(DateTime date, DayOfWeek dayOfWeek)
    {
        int daysToAdd = ((int)dayOfWeek - (int)date.DayOfWeek + 7) % 7;
        return date.AddDays(daysToAdd == 0 ? 7 : daysToAdd);
    }

    static void Main(string[] args)
    {
        Console.WriteLine("=== C# Current Time Demo ===\n");

        try
        {
            BasicCurrentTime();
            DateTimeComponents();
            DateTimeCreation();
            DateTimeArithmetic();
            TimeSpanOperations();
            DateComparison();
            MinMaxDates();
            DateValidationAndParsing();
            PerformanceConsiderations();
            RealWorldExamples();

            Console.WriteLine("\nAll current time examples completed successfully!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error in current time demo: {ex.Message}");
        }
    }
}

💻 日期和时间格式化 csharp

🟡 intermediate ⭐⭐⭐

全面的日期和时间格式化选项,包括特定文化格式、自定义模式和字符串解析

⏱️ 25 min 🏷️ csharp, datetime, formatting, culture, localization, windows
Prerequisites: C# DateTime basics, CultureInfo, String formatting
using System;
using System.Globalization;

class TimeFormatting
{
    // 1. Standard format strings
    public static void StandardFormatStrings()
    {
        Console.WriteLine("=== Standard Format Strings ===");

        DateTime now = DateTime.Now;

        Console.WriteLine($"Current DateTime: {now}");
        Console.WriteLine();

        // Date formats
        Console.WriteLine("Date Formats:");
        Console.WriteLine($"d (short date): {now:d}");
        Console.WriteLine($"D (long date): {now:D}");
        Console.WriteLine($"f (full date short time): {now:f}");
        Console.WriteLine($"F (full date long time): {now:F}");
        Console.WriteLine($"g (general date short time): {now:g}");
        Console.WriteLine($"G (general date long time): {now:G}");
        Console.WriteLine($"M/m (month day): {now:M}");
        Console.WriteLine($"Y/y (year month): {now:Y}");
        Console.WriteLine();

        // Time formats
        Console.WriteLine("Time Formats:");
        Console.WriteLine($"t (short time): {now:t}");
        Console.WriteLine($"T (long time): {now:T}");
        Console.WriteLine();

        // Combined formats
        Console.WriteLine("Combined Formats:");
        Console.WriteLine($"o (round-trip): {now:o}");
        Console.WriteLine($"s (sortable): {now:s}");
        Console.WriteLine($"u (universal sortable): {now:u}");
        Console.WriteLine($"U (universal full): {now:U}");
    }

    // 2. Custom format strings
    public static void CustomFormatStrings()
    {
        Console.WriteLine("\n=== Custom Format Strings ===");

        DateTime now = DateTime.Now;

        Console.WriteLine($"Current DateTime: {now}");
        Console.WriteLine();

        // Year formats
        Console.WriteLine("Year Formats:");
        Console.WriteLine($"yyyy (4-digit year): {now:yyyy}");
        Console.WriteLine($"yy (2-digit year): {now:yy}");
        Console.WriteLine();

        // Month formats
        Console.WriteLine("Month Formats:");
        Console.WriteLine($"MM (2-digit month): {now:MM}");
        Console.WriteLine($"M (1-2 digit month): {now:M}");
        Console.WriteLine($"MMMM (full month name): {now:MMMM}");
        Console.WriteLine($"MMM (abbreviated month): {now:MMM}");
        Console.WriteLine();

        // Day formats
        Console.WriteLine("Day Formats:");
        Console.WriteLine($"dd (2-digit day): {now:dd}");
        Console.WriteLine($"d (1-2 digit day): {now:d}");
        Console.WriteLine($"dddd (full day name): {now:dddd}");
        Console.WriteLine($"ddd (abbreviated day): {now:ddd}");
        Console.WriteLine();

        // Hour formats
        Console.WriteLine("Hour Formats:");
        Console.WriteLine($"HH (24-hour 2-digit): {now:HH}");
        Console.WriteLine($"H (24-hour 1-2 digit): {now:H}");
        Console.WriteLine($"hh (12-hour 2-digit): {now:hh}");
        Console.WriteLine($"h (12-hour 1-2 digit): {now:h}");
        Console.WriteLine();

        // Minute and second formats
        Console.WriteLine("Minute/Second Formats:");
        Console.WriteLine($"mm (2-digit minute): {now:mm}");
        Console.WriteLine($"m (1-2 digit minute): {now:m}");
        Console.WriteLine($"ss (2-digit second): {now:ss}");
        Console.WriteLine($"s (1-2 digit second): {now:s}");
        Console.WriteLine();

        // AM/PM designator
        Console.WriteLine($"tt (AM/PM): {now:tt}");
        Console.WriteLine($"t (first letter AM/PM): {now:t}");
    }

    // 3. Complex custom formats
    public static void ComplexCustomFormats()
    {
        Console.WriteLine("\n=== Complex Custom Formats ===");

        DateTime now = DateTime.Now;

        // Common business formats
        Console.WriteLine("Common Business Formats:");
        Console.WriteLine($"ISO 8601: {now:yyyy-MM-ddTHH:mm:ss}");
        Console.WriteLine($"Readable: {now:dddd, MMMM dd, yyyy HH:mm:ss}");
        Console.WriteLine($"Filename format: {now:yyyyMMdd_HHmmss}");
        Console.WriteLine($"Log format: {now:yyyy-MM-dd HH:mm:ss.fff}");
        Console.WriteLine($"US format: {now:MM/dd/yyyy hh:mm:ss tt}");
        Console.WriteLine($"European format: {now:dd.MM.yyyy HH:mm:ss}");
        Console.WriteLine($"Sortable: {now:yyyy-MM-dd HH:mm:ss}");

        // Custom examples
        Console.WriteLine("\nCustom Examples:");
        Console.WriteLine($"With timezone: {now:yyyy-MM-dd HH:mm:ss zzz}");
        Console.WriteLine($"Quarter format: Q{((now.Month - 1) / 3) + 1} {now:yyyy}");
        Console.WriteLine($"Week number: Week {CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(now, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)}, {now:yyyy}");

        // Custom formatting with literals
        Console.WriteLine("\nFormatting with Literals:");
        Console.WriteLine($"With quotes: {now:"Year" yyyy "Month" MM}");
        Console.WriteLine($"With escapes: {now:yyyy\\MM\\dd}");
    }

    // 4. Culture-specific formatting
    public static void CultureSpecificFormatting()
    {
        Console.WriteLine("\n=== Culture-Specific Formatting ===");

        DateTime now = DateTime.Now;

        // Different cultures
        CultureInfo[] cultures = {
            CultureInfo.GetCultureInfo("en-US"),  // English (United States)
            CultureInfo.GetCultureInfo("en-GB"),  // English (United Kingdom)
            CultureInfo.GetCultureInfo("fr-FR"),  // French (France)
            CultureInfo.GetCultureInfo("de-DE"),  // German (Germany)
            CultureInfo.GetCultureInfo("ja-JP"),  // Japanese (Japan)
            CultureInfo.GetCultureInfo("ar-SA"),  // Arabic (Saudi Arabia)
            CultureInfo.GetCultureInfo("zh-CN"),  // Chinese (China)
            CultureInfo.GetCultureInfo("es-ES")   // Spanish (Spain)
        };

        Console.WriteLine($"Current DateTime: {now}");
        Console.WriteLine();

        Console.WriteLine("Date formats by culture:");
        foreach (var culture in cultures)
        {
            Console.WriteLine($"{culture.Name,-8}: {now.ToString("d", culture)} | {now.ToString("D", culture)}");
        }

        Console.WriteLine("\nTime formats by culture:");
        foreach (var culture in cultures)
        {
            Console.WriteLine($"{culture.Name,-8}: {now.ToString("t", culture)} | {now.ToString("T", culture)}");
        }

        Console.WriteLine("\nFull date/time formats by culture:");
        foreach (var culture in cultures)
        {
            Console.WriteLine($"{culture.Name,-8}: {now.ToString("F", culture)}");
        }
    }

    // 5. TimeSpan formatting
    public static void TimeSpanFormatting()
    {
        Console.WriteLine("\n=== TimeSpan Formatting ===");

        TimeSpan[] timespans = {
            TimeSpan.FromDays(1.5),
            TimeSpan.FromHours(12.75),
            TimeSpan.FromMinutes(123.45),
            TimeSpan.FromSeconds(3661),
            TimeSpan.Parse("01:23:45.678")
        };

        Console.WriteLine("TimeSpan Formatting:");
        foreach (var ts in timespans)
        {
            Console.WriteLine($"\nTimeSpan: {ts}");
            Console.WriteLine(@"c format: {ts:c}");
            Console.WriteLine(@"g format: {ts:g}");
            Console.WriteLine(@"G format: {ts:G}");
            Console.WriteLine(@"Custom (hh\:mm\:ss): {ts:hh\:mm\:ss}");
            Console.WriteLine(@"Custom (d\.hh\:mm\:ss): {ts:d\.hh\:mm\:ss}");
            Console.WriteLine(@"Total hours: {ts.TotalHours:F2}");
            Console.WriteLine(@"Total minutes: {ts.TotalMinutes:F0}");
            Console.WriteLine(@"Total seconds: {ts.TotalSeconds:F0}");
        }

        // Duration formatting
        Console.WriteLine("\nDuration Formatting Examples:");
        TimeSpan duration = TimeSpan.Parse("02:15:30.123");
        Console.WriteLine($"Duration: {duration}");
        Console.WriteLine($"Hours and minutes: {duration:hh\:mm}");
        Console.WriteLine(@"With seconds: {duration:hh\:mm\:ss}");
        Console.WriteLine(@"With milliseconds: {duration:hh\:mm\:ss\.fff}");
        Console.WriteLine($"Friendly format: {FormatFriendlyDuration(duration)}");
    }

    // 6. String parsing with formats
    public static void StringParsingWithFormats()
    {
        Console.WriteLine("\n=== String Parsing with Formats ===");

        string[] dateStrings = {
            "2024-12-25",
            "25/12/2024",
            "December 25, 2024",
            "2024-12-25 14:30:45",
            "2:30 PM",
            "2024-12-25T14:30:45.123Z",
            "25 Dec 2024 2:30:45 PM"
        };

        string[] formats = {
            "yyyy-MM-dd",
            "dd/MM/yyyy",
            "MMMM dd, yyyy",
            "yyyy-MM-dd HH:mm:ss",
            "h:mm tt",
            "yyyy-MM-ddTHH:mm:ss.fffZ",
            "dd MMM yyyy h:mm:ss tt"
        };

        Console.WriteLine("String Parsing Examples:");
        foreach (string dateStr in dateStrings)
        {
            Console.WriteLine($"\nParsing: '{dateStr}'");

            // TryParseExact with all formats
            if (DateTime.TryParseExact(dateStr, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime parsedDate))
            {
                Console.WriteLine($"  Successfully parsed: {parsedDate:yyyy-MM-dd HH:mm:ss}");
            }
            else
            {
                Console.WriteLine("  Failed to parse with TryParseExact");

                // Try regular TryParse
                if (DateTime.TryParse(dateStr, out DateTime generalParsed))
                {
                    Console.WriteLine($"  General parse success: {generalParsed:yyyy-MM-dd HH:mm:ss}");
                }
                else
                {
                    Console.WriteLine("  General parse failed");
                }
            }
        }
    }

    // 7. Advanced formatting scenarios
    public static void AdvancedFormattingScenarios()
    {
        Console.WriteLine("\n=== Advanced Formatting Scenarios ===");

        DateTime now = DateTime.Now;

        // Scenario 1: Relative time formatting
        Console.WriteLine("Relative Time Formatting:");
        Console.WriteLine($"Time ago: {FormatRelativeTime(now.AddHours(-2))}");
        Console.WriteLine($"Time ago: {FormatRelativeTime(now.AddDays(-3))}");
        Console.WriteLine($"Time until: {FormatRelativeTime(now.AddHours(5))}");
        Console.WriteLine($"Time until: {FormatRelativeTime(now.AddDays(10))}");

        // Scenario 2: Fuzzy time formatting
        Console.WriteLine("\nFuzzy Time Formatting:");
        DateTime testTime = new DateTime(now.Year, now.Month, now.Day, 14, 27, 0);
        Console.WriteLine($"Actual time: {testTime:HH:mm}");
        Console.WriteLine($"Fuzzy time: {FormatFuzzyTime(testTime)}");

        testTime = new DateTime(now.Year, now.Month, now.Day, 9, 33, 0);
        Console.WriteLine($"Actual time: {testTime:HH:mm}");
        Console.WriteLine($"Fuzzy time: {FormatFuzzyTime(testTime)}");

        // Scenario 3: Age calculation with units
        DateTime birthDate = new DateTime(1990, 5, 15);
        Console.WriteLine($"\nAge calculation:");
        Console.WriteLine($"Birth date: {birthDate:yyyy-MM-dd}");
        Console.WriteLine($"Current age: {FormatAge(birthDate)}");

        // Scenario 4: Business date formatting
        Console.WriteLine("\nBusiness Date Formatting:");
        DateTime businessDate = new DateTime(2024, 12, 25);
        Console.WriteLine($"Date: {businessDate:yyyy-MM-dd}");
        Console.WriteLine($"Business format: {FormatBusinessDate(businessDate)}");
        Console.WriteLine($"Quarter: Q{((businessDate.Month - 1) / 3) + 1} {businessDate:yyyy}");
        Console.WriteLine($"Week: Week {CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(businessDate, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)}");
    }

    // 8. DateTime serialization
    public static void DateTimeSerialization()
    {
        Console.WriteLine("\n=== DateTime Serialization ===");

        DateTime now = DateTime.Now;

        // ISO 8601 formats
        string isoLocal = now.ToString("yyyy-MM-ddTHH:mm:ss");
        string isoWithOffset = now.ToString("yyyy-MM-ddTHH:mm:sszzz");
        string isoUtc = now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ");

        Console.WriteLine("ISO 8601 Formats:");
        Console.WriteLine($"Local: {isoLocal}");
        Console.WriteLine($"With offset: {isoWithOffset}");
        Console.WriteLine($"UTC: {isoUtc}");

        // Round-trip format
        string roundTrip = now.ToString("o");
        Console.WriteLine($"\nRound-trip format: {roundTrip}");

        // Parse back
        DateTime parsedFromRoundTrip = DateTime.Parse(roundTrip, null, DateTimeStyles.RoundtripKind);
        Console.WriteLine($"Parsed back: {parsedFromRoundTrip:yyyy-MM-dd HH:mm:ss.fff}");
        Console.WriteLine($"Equals original: {now == parsedFromRoundTrip}");

        // JSON friendly formats
        string jsonFormat = now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
        Console.WriteLine($"\nJSON friendly: {jsonFormat}");
    }

    // 9. Performance considerations
    public static void PerformanceConsiderations()
    {
        Console.WriteLine("\n=== Performance Considerations ===");

        const int iterations = 100000;
        DateTime testDate = DateTime.Now;

        // Test different formatting methods
        var stopwatch = System.Diagnostics.Stopwatch.StartNew();

        // ToString with format
        stopwatch.Restart();
        for (int i = 0; i < iterations; i++)
        {
            string formatted = testDate.ToString("yyyy-MM-dd HH:mm:ss");
        }
        stopwatch.Stop();
        Console.WriteLine($"ToString with format x {iterations:N0}: {stopwatch.ElapsedMilliseconds}ms");

        // Composite formatting
        stopwatch.Restart();
        for (int i = 0; i < iterations; i++)
        {
            string formatted = string.Format("{0:yyyy-MM-dd HH:mm:ss}", testDate);
        }
        stopwatch.Stop();
        Console.WriteLine($"String.Format x {iterations:N0}: {stopwatch.ElapsedMilliseconds}ms");

        // String interpolation
        stopwatch.Restart();
        for (int i = 0; i < iterations; i++)
        {
            string formatted = $"{testDate:yyyy-MM-dd HH:mm:ss}";
        }
        stopwatch.Stop();
        Console.WriteLine($"String interpolation x {iterations:N0}: {stopwatch.ElapsedMilliseconds}ms");

        // StringBuilder
        stopwatch.Restart();
        for (int i = 0; i < iterations; i++)
        {
            var sb = new System.Text.StringBuilder();
            sb.Append(testDate.ToString("yyyy-"));
            sb.Append(testDate.ToString("MM-"));
            sb.Append(testDate.ToString("dd "));
            sb.Append(testDate.ToString("HH:"));
            sb.Append(testDate.ToString("mm:"));
            sb.Append(testDate.ToString("ss"));
            string formatted = sb.ToString();
        }
        stopwatch.Stop();
        Console.WriteLine($"StringBuilder x {iterations:N0}: {stopwatch.ElapsedMilliseconds}ms");
    }

    // Helper methods for advanced scenarios
    static string FormatFriendlyDuration(TimeSpan ts)
    {
        if (ts.TotalDays >= 1)
        {
            int days = (int)ts.TotalDays;
            int hours = ts.Hours;
            return $"{days}d {hours}h";
        }
        else if (ts.TotalHours >= 1)
        {
            int hours = (int)ts.TotalHours;
            int minutes = ts.Minutes;
            return $"{hours}h {minutes}m";
        }
        else if (ts.TotalMinutes >= 1)
        {
            int minutes = (int)ts.TotalMinutes;
            return $"{minutes}m";
        }
        else
        {
            return $"{ts.Seconds}s";
        }
    }

    static string FormatRelativeTime(DateTime dateTime)
    {
        TimeSpan difference = dateTime - DateTime.Now;

        if (Math.Abs(difference.TotalSeconds) < 60)
        {
            return difference.TotalSeconds > 0 ? "in less than a minute" : "just now";
        }
        else if (Math.Abs(difference.TotalMinutes) < 60)
        {
            int minutes = (int)Math.Abs(difference.TotalMinutes);
            return difference.TotalMinutes > 0 ? $"in {minutes} minute{(minutes > 1 ? "s" : "")}" : $"{minutes} minute{(minutes > 1 ? "s" : "")} ago";
        }
        else if (Math.Abs(difference.TotalHours) < 24)
        {
            int hours = (int)Math.Abs(difference.TotalHours);
            return difference.TotalHours > 0 ? $"in {hours} hour{(hours > 1 ? "s" : "")}" : $"{hours} hour{(hours > 1 ? "s" : "")} ago";
        }
        else
        {
            int days = (int)Math.Abs(difference.TotalDays);
            return difference.TotalDays > 0 ? $"in {days} day{(days > 1 ? "s" : "")}" : $"{days} day{(days > 1 ? "s" : "")} ago";
        }
    }

    static string FormatFuzzyTime(DateTime time)
    {
        int hour = time.Hour;
        int minute = time.Minute;

        if (minute < 8)
            return $"{hour} o'clock";
        else if (minute < 23)
            return $"quarter past {hour}";
        else if (minute < 38)
            return $"half past {hour}";
        else if (minute < 53)
            return $"quarter to {(hour % 12) + 1}";
        else
            return $"{(hour % 12) + 1} o'clock";
    }

    static string FormatAge(DateTime birthDate)
    {
        DateTime today = DateTime.Today;
        int years = today.Year - birthDate.Year;
        int months = today.Month - birthDate.Month;
        int days = today.Day - birthDate.Day;

        if (days < 0)
        {
            months--;
            days += DateTime.DaysInMonth(today.Year, today.Month == 1 ? 12 : today.Month - 1);
        }

        if (months < 0)
        {
            years--;
            months += 12;
        }

        if (years > 0)
            return $"{years} year{(years > 1 ? "s" : "")}";
        else if (months > 0)
            return $"{months} month{(months > 1 ? "s" : "")}";
        else
            return $"{days} day{(days > 1 ? "s" : "")}";
    }

    static string FormatBusinessDate(DateTime date)
    {
        string dayName = date.ToString("ddd, MMM dd");
        if (date == DateTime.Today)
            return $"{dayName} (Today)";
        else if (date == DateTime.Today.AddDays(1))
            return $"{dayName} (Tomorrow)";
        else if (date == DateTime.Today.AddDays(-1))
            return $"{dayName} (Yesterday)";
        else
            return dayName;
    }

    static void Main(string[] args)
    {
        Console.WriteLine("=== C# Date and Time Formatting Demo ===\n");

        try
        {
            StandardFormatStrings();
            CustomFormatStrings();
            ComplexCustomFormats();
            CultureSpecificFormatting();
            TimeSpanFormatting();
            StringParsingWithFormats();
            AdvancedFormattingScenarios();
            DateTimeSerialization();
            PerformanceConsiderations();

            Console.WriteLine("\nAll date and time formatting examples completed successfully!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error in time formatting demo: {ex.Message}");
        }
    }
}

💻 时间解析和转换 csharp

🟡 intermediate ⭐⭐⭐

C#中的高级日期时间解析、时区转换和时区感知操作

⏱️ 30 min 🏷️ csharp, datetime, parsing, timezone, conversion, windows
Prerequisites: C# DateTime basics, TimeZoneInfo, Globalization
using System;
using System.Globalization;

class TimeParsingConversion
{
    // 1. Basic date parsing methods
    public static void BasicDateParsing()
    {
        Console.WriteLine("=== Basic Date Parsing ===");

        string[] dateStrings = {
            "2024-12-25",
            "25/12/2024",
            "December 25, 2024",
            "2024-12-25 14:30:45",
            "2:30 PM",
            "2024-12-25T14:30:45",
            "invalid date",
            "31/02/2024"
        };

        Console.WriteLine("Parsing with TryParse:");
        foreach (string dateStr in dateStrings)
        {
            Console.WriteLine($"'{dateStr}' -> ", end: "");

            if (DateTime.TryParse(dateStr, out DateTime parsed))
            {
                Console.WriteLine($"Success: {parsed:yyyy-MM-dd HH:mm:ss}");
            }
            else
            {
                Console.WriteLine("Failed");
            }
        }

        Console.WriteLine("\nParsing with Parse (throws exception):");
        foreach (string dateStr in dateStrings.Take(3)) // Only first 3 valid ones
        {
            try
            {
                DateTime parsed = DateTime.Parse(dateStr);
                Console.WriteLine($"'{dateStr}' -> {parsed:yyyy-MM-dd HH:mm:ss}");
            }
            catch (FormatException ex)
            {
                Console.WriteLine($"'{dateStr}' -> Error: {ex.Message}");
            }
        }
    }

    // 2. Parsing with specific formats
    public static void ParseWithSpecificFormats()
    {
        Console.WriteLine("\n=== Parsing with Specific Formats ===");

        string[] dateStrings = {
            "2024-12-25",
            "25/12/2024",
            "12-25-2024",
            "25.12.2024",
            "December 25, 2024",
            "Dec 25 2024",
            "2024年12月25日"
        };

        string[] formats = {
            "yyyy-MM-dd",
            "dd/MM/yyyy",
            "MM-dd-yyyy",
            "dd.MM.yyyy",
            "MMMM dd, yyyy",
            "MMM dd yyyy",
            "yyyy年MM月dd日"
        };

        Console.WriteLine("Parsing with TryParseExact:");
        foreach (string dateStr in dateStrings)
        {
            Console.WriteLine($"\nTrying '{dateStr}':");

            foreach (string format in formats)
            {
                if (DateTime.TryParseExact(dateStr, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime parsed))
                {
                    Console.WriteLine($"  Format '{format}' -> {parsed:yyyy-MM-dd}");
                }
            }

            // Try multiple formats at once
            if (DateTime.TryParseExact(dateStr, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime multiParsed))
            {
                Console.WriteLine($"  Multiple format success -> {multiParsed:yyyy-MM-dd}");
            }
        }
    }

    // 3. Culture-aware parsing
    public static void CultureAwareParsing()
    {
        Console.WriteLine("\n=== Culture-Aware Parsing ===");

        string dateString = "12/25/2024";

        CultureInfo[] cultures = {
            CultureInfo.GetCultureInfo("en-US"),  // MM/dd/yyyy
            CultureInfo.GetCultureInfo("en-GB"),  // dd/MM/yyyy
            CultureInfo.GetCultureInfo("fr-FR"),  // dd/MM/yyyy
            CultureInfo.GetCultureInfo("de-DE")   // dd.MM.yyyy
        };

        Console.WriteLine($"Parsing '{dateString}' with different cultures:");
        foreach (var culture in cultures)
        {
            if (DateTime.TryParse(dateString, culture, DateTimeStyles.None, out DateTime parsed))
            {
                Console.WriteLine($"{culture.Name,-8}: {parsed:yyyy-MM-dd}");
            }
            else
            {
                Console.WriteLine($"{culture.Name,-8}: Failed");
            }
        }

        // Example with month names
        string frenchDate = "25 décembre 2024";
        var frenchCulture = CultureInfo.GetCultureInfo("fr-FR");

        Console.WriteLine($"\nParsing '{frenchDate}' with French culture:");
        if (DateTime.TryParse(frenchDate, frenchCulture, DateTimeStyles.None, out DateTime frenchParsed))
        {
            Console.WriteLine($"Success: {frenchParsed:yyyy-MM-dd}");
        }

        // Example with AM/PM
        string timeString = "2:30 PM";
        var usCulture = CultureInfo.GetCultureInfo("en-US");

        Console.WriteLine($"\nParsing '{timeString}' with US culture:");
        if (DateTime.TryParse(timeString, usCulture, DateTimeStyles.None, out DateTime timeParsed))
        {
            Console.WriteLine($"Success: {timeParsed:HH:mm:ss}");
        }
    }

    // 4. DateTime conversion between types
    public static void DateTimeTypeConversion()
    {
        Console.WriteLine("\n=== DateTime Type Conversion ===");

        // DateTime to DateTimeOffset
        DateTime local = DateTime.Now;
        DateTimeOffset dateTimeOffset = new DateTimeOffset(local, TimeZoneInfo.Local.GetUtcOffset(local));

        Console.WriteLine($"DateTime: {local:yyyy-MM-dd HH:mm:ss}");
        Console.WriteLine($"DateTimeOffset: {dateTimeOffset:yyyy-MM-dd HH:mm:ss zzz}");

        // DateTimeOffset to DateTime
        DateTime fromOffset = dateTimeOffset.DateTime;
        DateTime fromOffsetUtc = dateTimeOffset.UtcDateTime;
        DateTime fromOffsetLocal = dateTimeOffset.LocalDateTime;

        Console.WriteLine($"\nFrom DateTimeOffset:");
        Console.WriteLine($"DateTime: {fromOffset:yyyy-MM-dd HH:mm:ss}");
        Console.WriteLine($"UtcDateTime: {fromOffsetUtc:yyyy-MM-dd HH:mm:ss}");
        Console.WriteLine($"LocalDateTime: {fromOffsetLocal:yyyy-MM-dd HH:mm:ss}");

        // DateOnly and TimeOnly (.NET 6+)
        Console.WriteLine("\nDateOnly and TimeOnly:");
        DateOnly dateOnly = DateOnly.FromDateTime(local);
        TimeOnly timeOnly = TimeOnly.FromDateTime(local);

        Console.WriteLine($"DateOnly: {dateOnly:yyyy-MM-dd}");
        Console.WriteLine($"TimeOnly: {timeOnly:HH:mm:ss}");

        // Convert back
        DateTime reconstructed = dateOnly.ToDateTime(timeOnly);
        Console.WriteLine($"Reconstructed: {reconstructed:yyyy-MM-dd HH:mm:ss}");
    }

    // 5. Time zone operations
    public static void TimeZoneOperations()
    {
        Console.WriteLine("\n=== Time Zone Operations ===");

        // Get local time zone
        TimeZoneInfo localZone = TimeZoneInfo.Local;
        Console.WriteLine($"Local time zone: {localZone.DisplayName}");
        Console.WriteLine($"Standard name: {localZone.StandardName}");
        Console.WriteLine($"Daylight name: {localZone.DaylightName}");
        Console.WriteLine($"UTC offset: {localZone.GetUtcOffset(DateTime.Now)}");

        // Get UTC time zone
        TimeZoneInfo utcZone = TimeZoneInfo.Utc;
        Console.WriteLine($"\nUTC time zone: {utcZone.DisplayName}");

        // Convert between time zones
        DateTime localTime = DateTime.Now;
        DateTime utcTime = TimeZoneInfo.ConvertTimeToUtc(localTime);
        DateTime backToLocal = TimeZoneInfo.ConvertTimeFromUtc(utcTime, localZone);

        Console.WriteLine($"\nTime zone conversions:");
        Console.WriteLine($"Local time: {localTime:yyyy-MM-dd HH:mm:ss}");
        Console.WriteLine($"UTC time: {utcTime:yyyy-MM-dd HH:mm:ss}");
        Console.WriteLine($"Back to local: {backToLocal:yyyy-MM-dd HH:mm:ss}");

        // Convert to specific time zone
        TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
        DateTime easternTime = TimeZoneInfo.ConvertTime(localTime, easternZone);

        Console.WriteLine($"\nEastern Time: {easternTime:yyyy-MM-dd HH:mm:ss} ({easternZone.DisplayName})");

        // List available time zones
        Console.WriteLine("\nAvailable time zones (first 10):");
        var timeZones = TimeZoneInfo.GetSystemTimeZones().Take(10);
        foreach (var zone in timeZones)
        {
            Console.WriteLine($"  {zone.Id}: {zone.DisplayName}");
        }
    }

    // 6. DateTimeOffset operations
    public static void DateTimeOffsetOperations()
    {
        Console.WriteLine("\n=== DateTimeOffset Operations ===");

        // Create DateTimeOffset
        DateTimeOffset localOffset = DateTimeOffset.Now;
        DateTimeOffset utcOffset = DateTimeOffset.UtcNow;
        DateTimeOffset specificOffset = new DateTimeOffset(2024, 12, 25, 14, 30, 0, TimeSpan.FromHours(-5));

        Console.WriteLine($"Local offset: {localOffset:yyyy-MM-dd HH:mm:ss zzz}");
        Console.WriteLine($"UTC offset: {utcOffset:yyyy-MM-dd HH:mm:ss zzz}");
        Console.WriteLine($"Specific offset (-5): {specificOffset:yyyy-MM-dd HH:mm:ss zzz}");

        // Convert between offsets
        DateTimeOffset converted = TimeZoneInfo.ConvertTime(specificOffset, TimeZoneInfo.Local);
        Console.WriteLine($"Converted to local: {converted:yyyy-MM-dd HH:mm:ss zzz}");

        // Arithmetic operations
        DateTimeOffset plusDay = localOffset.AddDays(1);
        DateTimeOffset plusHours = localOffset.AddHours(5);

        Console.WriteLine($"\nArithmetic:");
        Console.WriteLine($"Plus 1 day: {plusDay:yyyy-MM-dd HH:mm:ss zzz}");
        Console.WriteLine($"Plus 5 hours: {plusHours:yyyy-MM-dd HH:mm:ss zzz}");

        // Comparison
        Console.WriteLine($"\nComparison:");
        Console.WriteLine($"localOffset > utcOffset: {localOffset > utcOffset}");
        Console.WriteLine($"specificOffset.UtcDateTime: {specificOffset.UtcDateTime:yyyy-MM-dd HH:mm:ss}");
    }

    // 7. Daylight saving time handling
    public static void DaylightSavingTime()
    {
        Console.WriteLine("\n=== Daylight Saving Time Handling ===");

        TimeZoneInfo localZone = TimeZoneInfo.Local;

        // Check if DST is supported
        Console.WriteLine($"DST supported: {localZone.SupportsDaylightSavingTime}");

        if (localZone.SupportsDaylightSavingTime)
        {
            // Get DST rules
            var adjustmentRules = localZone.GetAdjustmentRules();
            if (adjustmentRules.Length > 0)
            {
                var currentRule = adjustmentRules[adjustmentRules.Length - 1]; // Most recent rule
                Console.WriteLine($"\nDST adjustment rule:");
                Console.WriteLine($"Daylight start: {currentRule.DaylightTransitionStart}");
                Console.WriteLine($"Daylight end: {currentRule.DaylightTransitionEnd}");
                Console.WriteLine($"Daylight delta: {currentRule.DaylightDelta}");
            }

            // Check if specific date is DST
            DateTime summerDate = new DateTime(2024, 7, 15);
            DateTime winterDate = new DateTime(2024, 1, 15);

            Console.WriteLine($"\nDST status:");
            Console.WriteLine($"{summerDate:yyyy-MM-dd} is DST: {localZone.IsDaylightSavingTime(summerDate)}");
            Console.WriteLine($"{winterDate:yyyy-MM-dd} is DST: {localZone.IsDaylightSavingTime(winterDate)}");

            // Get UTC offsets
            TimeSpan summerOffset = localZone.GetUtcOffset(summerDate);
            TimeSpan winterOffset = localZone.GetUtcOffset(winterDate);

            Console.WriteLine($"\nUTC offsets:");
            Console.WriteLine($"Summer offset: {summerOffset}");
            Console.WriteLine($"Winter offset: {winterOffset}");
            Console.WriteLine($"DST difference: {summerOffset - winterOffset}");
        }
    }

    // 8. Parsing and conversion challenges
    public static void ParsingAndConversionChallenges()
    {
        Console.WriteLine("\n=== Parsing and Conversion Challenges ===");

        // Challenge 1: Ambiguous dates during DST transition
        Console.WriteLine("Challenge 1: Ambiguous dates");
        var dstZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

        // Create ambiguous time (fall back)
        DateTime ambiguous = new DateTime(2024, 11, 3, 1, 30, 0); // During DST fall back

        Console.WriteLine($"Ambiguous time: {ambiguous:yyyy-MM-dd HH:mm:ss}");

        try
        {
            var ambiguousOffset = new DateTimeOffset(ambiguous, dstZone.GetUtcOffset(ambiguous));
            Console.WriteLine($"Resolved as: {ambiguousOffset:yyyy-MM-dd HH:mm:ss zzz}");
        }
        catch (ArgumentException ex)
        {
            Console.WriteLine($"Ambiguity error: {ex.Message}");
        }

        // Challenge 2: Invalid dates during DST transition
        Console.WriteLine("\nChallenge 2: Invalid dates");

        // Create invalid time (spring forward)
        DateTime invalid = new DateTime(2024, 3, 10, 2, 30, 0); // During DST spring forward

        Console.WriteLine($"Invalid time: {invalid:yyyy-MM-dd HH:mm:ss}");

        // Check if valid
        bool isValid = dstZone.IsValidTime(invalid);
        Console.WriteLine($"Is valid time: {isValid}");

        if (!isValid)
        {
            // Find next valid time
            TimeSpan utcOffset = dstZone.GetUtcOffset(invalid.AddDays(1));
            var nextValid = new DateTimeOffset(invalid, utcOffset).AddHours(1);
            Console.WriteLine($"Next valid time: {nextValid:yyyy-MM-dd HH:mm:ss zzz}");
        }

        // Challenge 3: Parsing Unix timestamps
        Console.WriteLine("\nChallenge 3: Unix timestamps");

        long unixTimestamp = 1703568000; // December 26, 2023 00:00:00 UTC
        DateTime fromUnix = DateTimeOffset.FromUnixTimeSeconds(unixTimestamp).DateTime;
        Console.WriteLine($"Unix timestamp {unixTimestamp} -> {fromUnix:yyyy-MM-dd HH:mm:ss}");

        // Convert to Unix timestamp
        long toUnix = ((DateTimeOffset)DateTime.UtcNow).ToUnixTimeSeconds();
        Console.WriteLine($"Current Unix timestamp: {toUnix}");
    }

    // 9. Real-world parsing scenarios
    public static void RealWorldParsingScenarios()
    {
        Console.WriteLine("\n=== Real-world Parsing Scenarios ===");

        // Scenario 1: Log file timestamp parsing
        string[] logTimestamps = {
            "2024-12-25 14:30:45.123",
            "25/12/2024 14:30:45",
            "Wed Dec 25 14:30:45 2024",
            "20241225143045"
        };

        Console.WriteLine("Log timestamp parsing:");
        string[] logFormats = {
            "yyyy-MM-dd HH:mm:ss.fff",
            "dd/MM/yyyy HH:mm:ss",
            "ddd MMM dd HH:mm:ss yyyy",
            "yyyyMMddHHmmss"
        };

        foreach (string timestamp in logTimestamps)
        {
            if (DateTime.TryParseExact(timestamp, logFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime parsed))
            {
                Console.WriteLine($"'{timestamp}' -> {parsed:yyyy-MM-dd HH:mm:ss.fff}");
            }
        }

        // Scenario 2: International date formats
        Console.WriteLine("\nInternational date formats:");
        string[] internationalDates = {
            "25/12/2024",     // European
            "12/25/2024",     // US
            "25.12.2024",     // German
            "2024年12月25日"   // Japanese
        };

        CultureInfo[] cultures = {
            CultureInfo.GetCultureInfo("en-GB"),
            CultureInfo.GetCultureInfo("en-US"),
            CultureInfo.GetCultureInfo("de-DE"),
            CultureInfo.GetCultureInfo("ja-JP")
        };

        for (int i = 0; i < internationalDates.Length; i++)
        {
            string dateStr = internationalDates[i];
            var culture = cultures[i];

            if (DateTime.TryParse(dateStr, culture, DateTimeStyles.None, out DateTime parsed))
            {
                Console.WriteLine($"'{dateStr}' ({culture.Name}) -> {parsed:yyyy-MM-dd}");
            }
        }

        // Scenario 3: Relative time parsing
        Console.WriteLine("\nRelative time parsing:");
        string[] relativeTimes = { "2 hours ago", "yesterday", "last week", "in 3 days", "next month" };

        foreach (string relative in relativeTimes)
        {
            DateTime? parsed = ParseRelativeTime(relative);
            if (parsed.HasValue)
            {
                Console.WriteLine($"'{relative}' -> {parsed.Value:yyyy-MM-dd HH:mm:ss}");
            }
            else
            {
                Console.WriteLine($"'{relative}' -> Not implemented");
            }
        }
    }

    // 10. Performance optimization
    public static void PerformanceOptimization()
    {
        Console.WriteLine("\n=== Performance Optimization ===");

        const int iterations = 10000;
        string testDate = "2024-12-25 14:30:45";
        string[] testDates = Enumerable.Repeat(testDate, iterations).ToArray();

        var stopwatch = System.Diagnostics.Stopwatch.StartNew();

        // Method 1: DateTime.Parse
        stopwatch.Restart();
        foreach (string dateStr in testDates)
        {
            DateTime.Parse(dateStr);
        }
        stopwatch.Stop();
        Console.WriteLine($"DateTime.Parse x {iterations:N0}: {stopwatch.ElapsedMilliseconds}ms");

        // Method 2: DateTime.TryParse (safe)
        stopwatch.Restart();
        foreach (string dateStr in testDates)
        {
            DateTime.TryParse(dateStr, out _);
        }
        stopwatch.Stop();
        Console.WriteLine($"DateTime.TryParse x {iterations:N0}: {stopwatch.ElapsedMilliseconds}ms");

        // Method 3: TryParseExact with pre-defined format
        stopwatch.Restart();
        foreach (string dateStr in testDates)
        {
            DateTime.TryParseExact(dateStr, "yyyy-MM-dd HH:mm:ss",
                                 CultureInfo.InvariantCulture, DateTimeStyles.None, out _);
        }
        stopwatch.Stop();
        Console.WriteLine($"DateTime.TryParseExact x {iterations:N0}: {stopwatch.ElapsedMilliseconds}ms");

        // Method 4: Custom parsing (if format is known)
        stopwatch.Restart();
        foreach (string dateStr in testDates)
        {
            CustomParseDateTime(dateStr);
        }
        stopwatch.Stop();
        Console.WriteLine($"Custom parse x {iterations:N0}: {stopwatch.ElapsedMilliseconds}ms");
    }

    // Helper methods
    static DateTime? ParseRelativeTime(string relative)
    {
        // Simplified relative time parsing
        DateTime now = DateTime.Now;
        relative = relative.ToLowerInvariant();

        if (relative == "yesterday")
            return now.AddDays(-1);
        else if (relative == "today")
            return now;
        else if (relative == "tomorrow")
            return now.AddDays(1);
        else if (relative.StartsWith("last "))
        {
            if (relative.Contains("week"))
                return now.AddDays(-7);
            else if (relative.Contains("month"))
                return now.AddMonths(-1);
            else if (relative.Contains("year"))
                return now.AddYears(-1);
        }
        else if (relative.StartsWith("next "))
        {
            if (relative.Contains("week"))
                return now.AddDays(7);
            else if (relative.Contains("month"))
                return now.AddMonths(1);
            else if (relative.Contains("year"))
                return now.AddYears(1);
        }
        else if (relative.EndsWith(" ago"))
        {
            string[] parts = relative.Split(' ');
            if (parts.Length == 2 && int.TryParse(parts[0], out int amount))
            {
                if (relative.Contains("hour"))
                    return now.AddHours(-amount);
                else if (relative.Contains("day"))
                    return now.AddDays(-amount);
            }
        }
        else if (relative.StartsWith("in "))
        {
            string[] parts = relative.Split(' ');
            if (parts.Length == 2 && int.TryParse(parts[1], out int amount))
            {
                if (relative.Contains("hour"))
                    return now.AddHours(amount);
                else if (relative.Contains("day"))
                    return now.AddDays(amount);
            }
        }

        return null;
    }

    static DateTime CustomParseDateTime(string dateTimeString)
    {
        // Fast custom parsing for known format "yyyy-MM-dd HH:mm:ss"
        int year = int.Parse(dateTimeString.Substring(0, 4));
        int month = int.Parse(dateTimeString.Substring(5, 2));
        int day = int.Parse(dateTimeString.Substring(8, 2));
        int hour = int.Parse(dateTimeString.Substring(11, 2));
        int minute = int.Parse(dateTimeString.Substring(14, 2));
        int second = int.Parse(dateTimeString.Substring(17, 2));

        return new DateTime(year, month, day, hour, minute, second);
    }

    static void Main(string[] args)
    {
        Console.WriteLine("=== C# Time Parsing and Conversion Demo ===\n");

        try
        {
            BasicDateParsing();
            ParseWithSpecificFormats();
            CultureAwareParsing();
            DateTimeTypeConversion();
            TimeZoneOperations();
            DateTimeOffsetOperations();
            DaylightSavingTime();
            ParsingAndConversionChallenges();
            RealWorldParsingScenarios();
            PerformanceOptimization();

            Console.WriteLine("\nAll time parsing and conversion examples completed successfully!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error in time parsing demo: {ex.Message}");
        }
    }
}