Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NodaTime根据CountryCode获取国家/地区时间_C#_Asp.net_Datetime_Utc_Nodatime - Fatal编程技术网

C# NodaTime根据CountryCode获取国家/地区时间

C# NodaTime根据CountryCode获取国家/地区时间,c#,asp.net,datetime,utc,nodatime,C#,Asp.net,Datetime,Utc,Nodatime,我有一个要求,管理员将为该国家/地区列表的用户选择一些国家/地区列表和警报时间 假设管理员在印度、马来西亚和加拿大的国家选择2014年7月24日上午9:00, 他们需要根据他们的时区获得警报,每个国家/地区用户需要在用户当地上午9点获得警报 因此,我只有他们的国家代码如在我的CA中 因此,我想得到他们的时区,并根据服务器时间计算 例如:我的服务器位于加拿大。因此,我考虑根据印度时区计算印度发出警报的时间,并将时间保存在Db中。因此,我的windows服务将在印度时间运行并推送警报 但为此,我需要

我有一个要求,管理员将为该国家/地区列表的用户选择一些
国家/地区列表
警报时间

假设管理员在印度、马来西亚和加拿大的
国家选择
2014年7月24日上午9:00
, 他们需要根据
他们的时区获得警报
,每个国家/地区用户需要在
用户当地上午9点获得警报

因此,我只有他们的
国家代码
在我的CA中

因此,我想得到他们的时区,并根据
服务器时间计算

例如:我的服务器位于
加拿大
。因此,我考虑根据
印度时区
计算
印度
发出警报的时间
,并
将时间保存在Db
中。因此,我的windows服务将在印度时间运行并推送警报

但为此,我需要在Db中保存多个不同时间的记录

因此,为了根据CountryCode获取时区,我使用了NodaTime

var CountryInfo = (from location in TzdbDateTimeZoneSource.Default.ZoneLocations
                     where location.CountryCode.Equals(CountryCode,
                           StringComparison.OrdinalIgnoreCase)
                     select new { location.ZoneId, location.CountryName })
                 .FirstOrDefault();
我从这个查询中得到了
时区ID


根据
管理员选择的日期时间
,我们能否获得
国家代码
当前日期和时间

我使用以下方法获得日期:

string CountryCode = "IN";

                var CountryInfo = (from location in TzdbDateTimeZoneSource.Default.ZoneLocations
                                   where location.CountryCode.Equals(CountryCode,
                                              StringComparison.OrdinalIgnoreCase)
                                   select new { location.ZoneId, location.CountryName })
                 .FirstOrDefault();

                var TimeZone = DateTimeZoneProviders.Tzdb[CountryInfo.ZoneId];
                DateTime objdate = Instant.FromDateTimeUtc(DateTime.UtcNow)
                          .InZone(TimeZone)
                          .ToDateTimeUnspecified();

我通过以下方式获得了日期:

string CountryCode = "IN";

                var CountryInfo = (from location in TzdbDateTimeZoneSource.Default.ZoneLocations
                                   where location.CountryCode.Equals(CountryCode,
                                              StringComparison.OrdinalIgnoreCase)
                                   select new { location.ZoneId, location.CountryName })
                 .FirstOrDefault();

                var TimeZone = DateTimeZoneProviders.Tzdb[CountryInfo.ZoneId];
                DateTime objdate = Instant.FromDateTimeUtc(DateTime.UtcNow)
                          .InZone(TimeZone)
                          .ToDateTimeUnspecified();

您的代码几乎是正确的-虽然它可以简化一些,并使其更易于测试,并且它应该处理没有这样的区域的情况

// You should use dependency injection really - that makes the code much more
// testable. Basically, you want an IClock...
IClock clock = SystemClock.Instance;

var countryCode = "IN";
var location = TzdbDateTimeZoneSource.Default.ZoneLocations
                 .FirstOrDefault(l => l.CountryCode == countryCode);
if (location == null)
{
    // This is up to you - there's no location with your desired country code.
}
else
{
    var zone = DateTimeZoneProviders.Tzdb[location.ZoneId];
    var zonedNow = clock.Now.InZone(zone);
    // Now do what you want with zonedNow... I'd avoid going back into BCL
    // types, myself.
}

请记住,这是假设一个国家只有一个时区——情况并非总是如此。想想美国,那里有很多时区…

您的代码几乎是正确的-尽管它可以稍微简化,并且更易于测试,并且它应该能够处理没有时区的情况

// You should use dependency injection really - that makes the code much more
// testable. Basically, you want an IClock...
IClock clock = SystemClock.Instance;

var countryCode = "IN";
var location = TzdbDateTimeZoneSource.Default.ZoneLocations
                 .FirstOrDefault(l => l.CountryCode == countryCode);
if (location == null)
{
    // This is up to you - there's no location with your desired country code.
}
else
{
    var zone = DateTimeZoneProviders.Tzdb[location.ZoneId];
    var zonedNow = clock.Now.InZone(zone);
    // Now do what you want with zonedNow... I'd avoid going back into BCL
    // types, myself.
}

请记住,这是假设一个国家只有一个时区——情况并非总是如此。想想美国,那里有很多时区…

谢谢你的建议@Jon Skeet,因为我观察了系统时钟。实例正在发出UtcNow,对吗?你能看看我的要求并给我一些建议吗。因为我觉得我保存多个国家记录并通过windows服务发送记录的方式不对。@RealSteel:嗯,
IClock。现在
返回一个
即时
,它不在任何特定的时区(或日历)中。但从根本上说,如果你只知道某人的国家,你就不一定能说出他们的时区。谢谢你的建议@Jon Skeet As,我已经观察到了系统时钟。Instance正在发出UtcNow,对吗?你能看看我的要求并给我一些建议吗。因为我觉得我保存多个国家记录并通过windows服务发送记录的方式不对。@RealSteel:嗯,
IClock。现在
返回一个
即时
,它不在任何特定的时区(或日历)中。但从根本上说,如果你只知道某人的国家,你就不一定能说出他们的时区。