Get the default timezone for a country (via CultureInfo)

前端 未结 6 1613
广开言路
广开言路 2020-11-30 05:20

Is there a program or a table that provides the default timezone for every country?

Yes, the US, Canada, & Russia have multiple timezones. (I think every other c

6条回答
  •  情话喂你
    2020-11-30 05:40

    Some countries have more as one timezone for example russia.

    In my solution i use NodaTime if you have a longitude information available i select the best timezone for this country.

    var countryName = "Russia";
    var longitude = 40.332206;
    
    var zones = TzdbDateTimeZoneSource.Default.ZoneLocations.Where(x => x.CountryName == countryName).AsQueryable();
    if (!double.IsNaN(longitude))
    {
        zones = zones.OrderBy(o => this.Distance(o.Latitude, longitude, o.Latitude, o.Longitude, DistanceUnit.Kilometer));
    }
    var bestZone = zones.FirstOrDefault();
    var dateTimeZone = TzdbDateTimeZoneSource.Default.ForId(bestZone.ZoneId);
    
    var newTime = DateTime.UtcNow.AddSeconds(dateTimeZone.MaxOffset.Seconds);
    

    Calculate distance of geo coordinates

    public enum DistanceUnit { StatuteMile, Kilometer, NauticalMile };
    
    private double Distance(double lat1, double lon1, double lat2, double lon2, DistanceUnit unit)
    {
        double rlat1 = Math.PI * lat1 / 180;
        double rlat2 = Math.PI * lat2 / 180;
        double theta = lon1 - lon2;
        double rtheta = Math.PI * theta / 180;
        double dist =
            Math.Sin(rlat1) * Math.Sin(rlat2) + Math.Cos(rlat1) *
            Math.Cos(rlat2) * Math.Cos(rtheta);
        dist = Math.Acos(dist);
        dist = dist * 180 / Math.PI;
        dist = dist * 60 * 1.1515;
    
        switch (unit)
        {
            case DistanceUnit.Kilometer:
                return dist * 1.609344;
            case DistanceUnit.NauticalMile:
                return dist * 0.8684;
            default:
            case DistanceUnit.StatuteMile: //Miles
                return dist;
        }
    }
    

提交回复
热议问题