例如,如果我有以下代码:
var nodaStart = new LocalDate(2012, 5, 1);
var nodaEnd = new LocalDate(2012,5,2);
var daysBetween = Period.Between(nodaStart, nodaEnd,PeriodUnits.Day);
Run Code Online (Sandbox Code Playgroud)
然后 daysBetween.Days == 1
但是,我计算的范围需要计算为2天.即它需要包括开始和结束日期.
实际的方法可以采取开始和结束日期(相隔不超过一年),并需要计算天数.如果超过31天,则剩余的数量将返回整周.
我有那种逻辑工作正常,但因为计数是独家我有一天出去了.
我想我可以startDate.addDays(-1)在创建nodaStart它之前做,但我想知道是否有更优雅/漂亮的方式让noda返回Period.
谢谢
更新:我已经阅读了类的源代码,Period并且+运算符被重载,所以我可以添加
daysBetween += Period.FromDays(1);
Run Code Online (Sandbox Code Playgroud) 我正试图让Jon Skeet(以及其他人)使用Noda Time框架.
如何存储DateTimeZone并从数据库中检索它.我认为Id属性值可能是设置为数据库的值,但是如何从Id创建DateTimeZone,因为DateTimeZone是一个抽象类?
我有一个在OperationContract参数中使用Noda Time类型(LocalDate和ZonedDateTime)的服务,但是当我尝试发送时,例如LocalDate(1990,7,31)服务器收到一个具有默认值(1970/1/1)的对象.客户端或服务器不会引发任何错误.
以前它适用于相应的BCL类型(DateTimeOffset).我理解NCF时间类型可能不会被WCF"知道",但我看不出我应该如何添加它们.我在关于已知类型的文档中检查了此页面,但它没有帮助.
有没有办法做到这一点,以避免从BCL类型到BCL类型的手动转换/序列化(可能不完整)?
谢谢.
有没有理由说NodaTime JSON.net序列化程序不使用ISO8601时间间隔格式来表示开始和结束时刻?
示例ISO8601时间间隔:
"2007-03-01T13:00:00Z/2008-05-11T15:30:00Z"
Run Code Online (Sandbox Code Playgroud)
NodaTime Complex JSON:
{ Start: "2007-03-01T13:00:00Z", End: "2008-05-11T15:30:00Z" }
Run Code Online (Sandbox Code Playgroud)
ISO8601格式是否不适合NodaTime中的区间概念?
我希望能够从csv文件中解析日期和/或日期时间值,并获取其DateTime格式(或使用Excel术语NumberFormat)。
例如,我想将“ 2008-06-07 00:00:00.000”传递给函数,并使其返回类似“ yyyy-MM-dd hh:mm:ss.000”的信息。
要注意的是,csv文件中可能有许多可能的日期格式,而且它们都不是提前知道的,所以我不能使用DateTime.TryParseExact(),因为它要求您提前知道DateTime格式字符串才能进行测试查看它是否具有特定值。
通过了解日期格式,我可以将其设置为Excel中的自定义数字格式,然后输入值,它将与csv文件的文本完全一样,同时还可以在Excel公式中使用它。
当然,可能存在歧义,因此理想情况下,获取可能的日期格式列表,然后通过查看可能的日期格式列表的交集,对多个日期进行检查以删除某些选项会比较好。
我刚刚发现了NodaTime API,看起来它可以执行类似的操作,但是我还没有看到示例代码可以实现此目的,因为有关类似查询的大多数问题都被要求提供早期版本,而没有似乎受到支持。
这样做的任何其他方法也将不胜感激。
正如乔恩·斯凯特(Jon Skeet)所说,我认为做到这一点的唯一方法是列出常见模式并进行测试。通过执行以下操作,可以获得所有文化的日期时间模式集。但是,此列表将缺少一些可能在使用中常见的自定义模式。例如(我不知道是否常用)yyyy / dd / MM不在列表中。
private static HashSet<string> _patterns;
public static HashSet<string> AllCulturedDateTimePatterns
{
get
{
if (_patterns != null)
return _patterns;
_patterns = new HashSet<string>();
var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
foreach (var culture in cultures)
{
_patterns.UnionWith(culture.DateTimeFormat.GetAllDateTimePatterns());
}
return _patterns;
}
}
Run Code Online (Sandbox Code Playgroud) 我是NodaTime的新手,我想在我的应用程序中实现它.
如何将日期字符串解析为NodaTime对象?
这是我现在拥有的:
var dateInput = "06/11/2015";
var pattern = InstantPattern.CreateWithInvariantCulture("dd/MM/yyyy");
var parseResult = pattern.Parse(dateInput);
var localDate = parseResult.Value;
DateTimeZone tzNZ = DateTimeZoneProviders.Tzdb["Asia/Hong_Kong"];
ZonedDateTime result = localDate.InZone(tzNZ);
Run Code Online (Sandbox Code Playgroud)
我的localDate变量现在是2015-11-06T00:00:00Z(并且根据我在ISO格式中读到的,在最后一部分中指示Z表示它是UTC)
我的结果变量现在 2015-11-06T13:00:00 NZ (+13)
但我不确定我是否走在正确的道路上.
这就是我真正想要的.
dateInput使用以下格式将(日期字符串)转换为NodaTime对象dd/MM/yyyylong数据类型,然后将其保存到数据库Asia/Hong_Kong可能吗?
编辑
var dateInput = "06/11/2015";
var pattern = LocalDatePattern.CreateWithInvariantCulture("dd/MM/yyyy");
LocalDate parseResult = pattern.Parse(dateInput).Value;
DateTimeZone tzHK = DateTimeZoneProviders.Tzdb["Asia/Hong_Kong"];
LocalTime time = GetTimeOfDay();
LocalDateTime localDateTime = parseResult + time;
// change it to UTC then convert it …Run Code Online (Sandbox Code Playgroud) 我有一个问题将时间值反序列化为LocalTime-授予,我对NodaTime很新.我想导入一个Web服务结果,该结果以"HH:mm"格式列出时间.除非我以"hh:mm:ss.fff"格式使用时间,否则我会收到异常.有没有办法指定不同的模式并让"HH:mm"起作用?
请参阅此代码
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using NodaTime;
using NodaTime.Serialization.JsonNet;
using NodaTime.Text; // Required for LocalTimePattern
namespace TestNodaTime
{
class MyObject
{
[JsonProperty("var1")]
public int MyProperty { get; set; }
[JsonProperty("time")]
public LocalTime MyTime { get; set; }
}
class Program
{
static void Main(string[] args)
{
string serializedObject1 = "[{\"var1\":\"42\",\"time\":\"01:02:03.004\"}]";
string serializedObject2 = "[{\"var1\":\"42\",\"time\":\"01:02\"}]";
JsonSerializerSettings jss = new JsonSerializerSettings();
jss.ConfigureForNodaTime(DateTimeZoneProviders.Bcl);
// This works - the pattern is "hh:mm:ss.fff"
MyObject mo1 = JsonConvert.DeserializeObject<List<MyObject>>(serializedObject1, jss)[0];
// This causes an …Run Code Online (Sandbox Code Playgroud) 目标是创建一个函数,使用Nodatime将时间从一个时区转换为另一个时区.我不只是在寻找关于结果是否正确的反馈,而是针对"我如何"这样做的反馈(这是真的正确,还是有微妙的漏洞).
这是功能:
static ZonedDateTime ConvertDateTimeToDifferentTimeZone(DateTime p_from_datetime, string p_from_zone, string p_to_zone)
{
DateTimeZone from_zone = DateTimeZoneProviders.Tzdb[p_from_zone];
LocalDateTime from_local = new LocalDateTime(p_from_datetime.Year, p_from_datetime.Month, p_from_datetime.Day, p_from_datetime.Hour, p_from_datetime.Minute);
ZonedDateTime from_datetime = from_zone.AtStrictly(from_local);
var from_instant = from_datetime.ToInstant();
DateTimeZone to_zone = DateTimeZoneProviders.Tzdb[p_to_zone];
ZonedDateTime to_datetime = to_zone.AtStrictly(from_local);
var to_offset_datetime = from_instant.WithOffset(to_datetime.Offset);
return to_zone.AtStrictly(to_offset_datetime.LocalDateTime);
}
Run Code Online (Sandbox Code Playgroud)
我称之为的方式如下:
DateTime from_datetime = new DateTime(2016, 10, 15, 16, 30, 0);
string from_zone = "US/Central";
string to_zone = "US/Eastern";
var x = ConvertDateTimeToDifferentTimeZone(from_datetime, from_zone, to_zone);
Console.WriteLine(from_datetime.ToString() + " (" + from_zone + ") …Run Code Online (Sandbox Code Playgroud) 我有一个System.DateTime已经在特定时区但未指定DateTime.Kind的字符串和表示IANA时区的字符串.我想将其转换为NodaTime.ZonedDateTime.
例如:
var original = new DateTime(2016, 1, 1, 12, 0, 0);
var timezone = "America/Chicago";
Run Code Online (Sandbox Code Playgroud)
我想要一个ZonedDateTime代表01/01/2016 - 芝加哥时间12点的节目.我该怎么做呢?
我使用Noda Time,并具有以下代码:
var pattern = ZonedDateTimePattern.CreateWithInvariantCulture(
"yyyy-MM-dd HH:mm:ss z",
DateTimeZoneProviders.Tzdb);
var parsed = pattern.Parse("2017-11-05 01:00:00 America/Los_Angeles");
Console.WriteLine(parsed.Value);
Run Code Online (Sandbox Code Playgroud)
结果为UnparsableValueException:
本地日期/时间在目标时区中不明确
据我了解,问题在于由于夏令时,该特定时间可能会发生两次。在02:00,时钟返回1小时至01:00。NodaTime不知道该字符串所指的是01:00的哪个“版本”,并且因此引发了异常。
对我来说,解析产生的时间版本并不重要,我只想避免出现异常,并获得尽可能接近实际的日期。一小时或更短的时间可以。最好的方法是什么?
我能想到的唯一方法是拆分字符串并分别解析各个部分,然后再添加一个小时,但这感觉是完全错误的。有更好的解决方案吗?