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。现在
返回一个即时
,它不在任何特定的时区(或日历)中。但从根本上说,如果你只知道某人的国家,你就不一定能说出他们的时区。