我喜欢Noda Time使用命名空间中的*Pattern各种类型处理格式化和解析值NodaTime.Text.但是,用户输入通常不像单个格式那样规则.例如,我们的应用程序使用时间格式,"h:mm tt"但我们希望能够以下列任何格式解析用户输入:
h:mm tth:mmtt (没有空间)h:mm th:mmt (没有空间)h tthh:mm有没有办法使用Noda Time来解析可能有多种格式的输入?
我正在使用NodaTime,因为它对zoneinfo数据有很好的支持,但我有一个案例需要将其DateTimeZone转换TimeZoneInfo为在Quartz.NET中使用.
这里推荐的方法是什么?IANA在Windows时区和zoneinfo时区之间有一个映射文件,我可以创建一个利用此信息的扩展方法吗?
谢谢,迪恩
我需要将来自不同时区的'DateTime'值转换为UTC,反之亦然.我使用TimeZoneInfo来做到这一点.但是,问题在于"日间节能"时间的变化.
例如,今年,下一次时间变化发生在11月3日凌晨2点[CDT].所以11月3日凌晨1点[CDT]转换为6AM,随着时间的推移,下一个小时我们得到1AM [现在它的CST]再次,它也转换为早上6点.我尝试了这个页面上的代码,但它没有说明如何处理这个问题.那么如何处理这个问题?
编辑:
我尝试了NodaTime,当我进行转换时
DateTimeZoneProviders.Tzdb["America/Chicago"].AtStrictly(<localDateTime>)
Run Code Online (Sandbox Code Playgroud)
它抛出AmbiguousTimeException.这很好,我也可以使用TimeZoneInfo来做到这一点.但是我怎么知道我需要选择哪个localTime值?
编辑2:
这是与Matt聊天讨论的链接.
我有一个LocalDate项目列表,代表开始日期和结束日期的集合.
我希望能够存储日期范围,以便我可以对它们进行操作,作为一组重叠或不同的范围等.
我对NodaTime完全不熟悉,并认为这对我来说是一个概念上的误解.
更新:我从2009年开始注意到关于这个主题的类似问题,但这似乎是指另一个实用类; 我假设从那时起NodaTime可能已经发展到适应这种情况.
我正在尝试使用Json.NET序列化一些Noda Time值并遇到麻烦.序列化很简单:
LocalDateTime dt = ... // Assigned elsewhere
LocalDateTimePattern isoDateTimePattern = LocalDateTimePattern.GeneralIsoPattern;
JObject root = new JObject();
root.Add("time", isoDateTimePattern.Format(dt));
// Serialize other elements
using (var sw = new StreamWriter(stream)) {
serializer.Serialize(sw, root);
}
Run Code Online (Sandbox Code Playgroud)
但是反序列化是有问题的.Json.NET似乎从上面识别出ISO格式的日期和时间,并自动将其转换为DateTime对象,这不是我想要的.
using (var sr = new StreamReader(stream)) {
using (var jr = new JsonTextReader(sr)) {
var root = serializer.Deserialize<JObject>(jr);
// Deserialize other elements
var time = root.GetValue("time"); // time.Type is JTokenType.Date
string timeStr = time.Value<string>(); // Is "01/10/2014 10:37:32"
// Kaboom. String is not in the …Run Code Online (Sandbox Code Playgroud) 我要求存储数据库中记录的所有日期必须记录为UTC.到目前为止,我可以使用Noda库使用以下方法实现此目的:
public static DateTime NowUtc(string timeZoneId)
{
var timeZone = GetTimeZone(timeZoneId);
var instant = SystemClock.Instance.Now;
return instant.InZone(timeZone).ToDateTimeUtc();
}
Run Code Online (Sandbox Code Playgroud)
我将验证传递到数据访问层的每个日期必须是UTC格式.
我如何实现这一目标?
谢谢
注意:我创建了一个自定义类库,它使用Noda作为核心引擎,输出转换回System.DateTime.
抱歉,如果这似乎是一个简单的问题,但我大多只想检查我所拥有的解决方案对于所有情况都是最明智/最有效的.
我们使用的预先存在的SQL Server数据库将'period'存储为包含start - >包含结束UTC DateTime值.(开始和结束列都会datetime2(7)自动转换为我们开始使用它们之前的System.DateTime实例DateTimeKind.UTC).
因此,如果我需要存储"整天/月/年,给定用户的时区",我需要找到"特定DateTimeZone中指定LocalDate的最后一个可能的瞬间".
我的方法如下:
public static LocalDateTime AtEndOfDay(this LocalDate localDate)
{
return localDate
.PlusDays(1)
.AtMidnight()
.PlusTicks(-1);
}
public static ZonedDateTime AtEndOfDay(this DateTimeZone zone, LocalDate localDate)
{
return zone
.AtStartOfDay(localDate.PlusDays(1))
.Plus(Duration.FromTicks(-1));
}
Run Code Online (Sandbox Code Playgroud)
我想我还需要避免(在任何其他地方)映射"日期结束" LocalDateTime使用,.AtLeniently(..)因为如果23:59:59.9999999被"跳过"并且在目标中不存在DateTimeZone,那么它将被映射到下一个可用的瞬间缺口00:00:00.000000的'外侧',这将给我一个独家 ZonedDateTime价值.
修订方法:
public static LocalDateTime AtEndOfDay(this LocalDate localDate)
{
// TODO: Replace with localDate.At(LocalTime.MaxValue) when NodaTime 2.0 is released.
return localDate
.PlusDays(1)
.AtMidnight()
.PlusTicks(-1);
}
public static ZonedDateTime …Run Code Online (Sandbox Code Playgroud) 如果我只有一个表示时区的字符串,那么获取分钟的最简单方法是什么?(例如"欧洲/伦敦")
到目前为止,我有:
public static int ConvertFromTimeZoneToMinutesOffset(string timeZone)
{
DateTimeZone zone = DateTimeZoneProviders.Tzdb[timeZone];
// Need magic code to get offset as minutes
}
Run Code Online (Sandbox Code Playgroud)
但我找不到一个简单的方法将其转换为分钟.
注意:我需要的是在执行代码的特定时刻的偏移量.在该时区和UTC之间.
我正在研究使用NodaTime LocalDate来替换我们现有的BCL DateTime/DateTimeOffset类.由于我们对DateTime可论证的模糊行为的误解,我们在代码中遇到了许多与时区相关的问题.
为了充分利用NodaTime,我希望能够从YYYY-MM-DD形式的ASP.NET Web API 2 Web服务发送和接收日期.我已成功将LocalDate正确序列化为YYYY-MM-DD.但是,我无法将日期查询参数反序列化为LocalDate.LocateDate始终是1970-01-01.
这是我当前的原型代码(为清楚起见,删除了一些代码):
PeopleController.cs
[RoutePrefix("api")]
public class PeopleController : ApiController
{
[Route("people")]
public LocalDate GetPeopleByBirthday([FromUri]LocalDate birthday)
{
return birthday;
}
}
Run Code Online (Sandbox Code Playgroud)
的Global.asax.cs
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
// Web API configuration and services
var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
settings.Formatting = Formatting.Indented;
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
Run Code Online (Sandbox Code Playgroud)
我通过执行Web服务
http://localhost/api/people?birthday=1980-11-20
Run Code Online (Sandbox Code Playgroud)
但是,返回的是1970年1月1日.进入代码我确认birthday设置为1970-01-01.
如何配置序列化,以便将URL中指定的日期作为查询参数(或路径元素)正确地序列化为NodaTime LocalDate?
所以我是NodaTime的新手,并尝试使用它来使用DateTimeZone对象存储时区信息.
我在下面的示例中看到了用户指南等,这给了我一个很好的来自tzdb的DateTimeZone对象.
var london = DateTimeZoneProviders.Tzdb["Europe/London"];
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 如何获得tzdb中使用的时区字符串列表("Europe/London").我环顾四周,无处可寻.在某处我可以参考标准清单吗?这是如何运作的?恩. - 我应该为EST传递的字符串是什么?
谢谢!