How to display DateTime with an abbreviated Time Zone?

前端 未结 8 912
长情又很酷
长情又很酷 2020-12-08 19:02

I am aware of the System.TimeZone class as well as the many uses of the DateTime.ToString() method. What I haven\'t been able to find is a way to convert a DateTime to a st

相关标签:
8条回答
  • 2020-12-08 19:19

    If you are using <= .Net 3.0 then download TZ4Net and use OlsonTimeZone.CurrentTimeZone.StandardAbbreviation for > .Net 3.0 use NodaTime or other. The timezones names do not conform to any convention where you can rely on simple string manipulation to construct the abbreviation from an acronym. Wrong 5% of the time is still wrong.

    0 讨论(0)
  • 2020-12-08 19:20

    Here's my quick hack method I just made to work around this.

    public static String TimeZoneName(DateTime dt)
    {
        String sName = TimeZone.CurrentTimeZone.IsDaylightSavingTime(dt) 
            ? TimeZone.CurrentTimeZone.DaylightName 
            : TimeZone.CurrentTimeZone.StandardName;
    
        String sNewName = "";
        String[] sSplit = sName.Split(new char[]{' '});
        foreach (String s in sSplit)
            if (s.Length >= 1)
                sNewName += s.Substring(0, 1);
    
        return sNewName;
    }
    
    0 讨论(0)
  • 2020-12-08 19:20

    There is a freely available library, TZ4NET, which has these abbreviations available. Prior to .NET 3.5, this was one of the only alternatives for converting between timezones as well.

    If you don't want a seperate library, you could certainly generate a map of reasonable abbreviations using the TimeZoneInfo classes, and then just supply those to your user.

    0 讨论(0)
  • 2020-12-08 19:27

    I would create a lookup table that converts time zone name to its abbreviation. If the match is not found you could return full zone name.

    See time zone abbreviations.

    0 讨论(0)
  • 2020-12-08 19:29

    It depends on the level of robustness that you need.

    You'll probably need some kind of hack either way. An easy way would be to split the string by spaces and then concatenate the first letter of each word. i.e.

    string[] words = tzname.Split(" ".ToCharArray());
    string tzabbr = "";
    foreach (string word in words)
       tzabbr += word[0];
    

    That won't work for every time zone on the planet, but it will work for most of them. If you need it more robust then you'll probably need to create a map that maps time zone names to their abbreviations.

    0 讨论(0)
  • 2020-12-08 19:40

    Use nodatime.

    The following function takes a DateTime in UTC time and formats it with abbreviated local system timezone. Use x in format string for abbreviated timezone. Look for custom formatting here.

        public static string ConvertToFormattedLocalTimeWithTimezone(DateTime dateTimeUtc)
        {
            var tz = DateTimeZoneProviders.Tzdb.GetSystemDefault(); // Get the system's time zone
            var zdt = new ZonedDateTime(Instant.FromDateTimeUtc(dateTimeUtc), tz);
            return zdt.ToString("MM'/'dd'/'yyyy' 'hh':'mm':'ss' 'tt' 'x", CultureInfo.InvariantCulture);
        }
    
    0 讨论(0)
提交回复
热议问题