Tag: nodatime

在NodaTime中使用不在午夜开始的日子

我正在开发一个有火车时刻表的应用程序,第一列火车在0400离开,而末class火车在0200离开。因此,该应用程序的用户处理从0300开始到0300结束的日子。换句话说,当他们说“星期三的火车在0200“他们真的意味着”火车于周四0200离开“。 我们的应用程序需要存储所有在周三(例如)周三离开的列车,这意味着它不应该包括0300之前离开的列车,但它应该包括第二天离开的列车直到0300。 如何在不疯狂的情况下在应用程序中表示这一点? 如何将其存储在数据库中以便于查询?

Noda Time:Period.Between()返回错误的天数?

鉴于下面的代码片段,为什么最后四个输出周期相同? 我希望那些行的Days部分是4,3,2,1不是4,4,4,4。这是一个bug还是我错过了一些明显的东西? (已经很晚了,我很累,所以很可能是后者。)我正在使用Noda Time 1.2.0。 for (int day = 25; day <= 31; day++) { var d1 = new LocalDate(2013, 12, day); var d2 = new LocalDate(2015, 3, 4); var period = Period.Between(d1, d2); Debug.WriteLine("Day: {0}, Period: {1}", day, period); } // I get the following output: Day: 25, Period: P1Y2M7D Day: 26, Period: P1Y2M6D […]

使用NodaTime计算包含天数

例如,如果我有以下代码: var nodaStart = new LocalDate(2012, 5, 1); var nodaEnd = new LocalDate(2012,5,2); var daysBetween = Period.Between(nodaStart, nodaEnd,PeriodUnits.Day); 然后daysBetween.Days == 1 但是,我计算的范围需要计算为2天。 即它需要包括开始和结束日期。 实际的方法可以采取开始和结束日期(相隔不超过一年),并需要计算天数。 如果超过31天,则剩余的数量将返回整周。 我有那种逻辑工作正常,但因为计数是独家我有一天出去了。 我想我可以在创建nodaStart之前做startDate.addDays(-1) ,但我想知道是否有更优雅/漂亮的方式让noda返回Period。 谢谢 更新:我已经阅读了Period类的源代码 ,并且+运算符被重载,所以我可以添加 daysBetween += Period.FromDays(1);

如何将Noda Time(或任何第三方类型)对象作为参数传递给WCF?

我有一个在OperationContract参数中使用Noda Time类型( LocalDate和ZonedDateTime )的服务,但是当我尝试发送例如LocalDate(1990,7,31) ,服务器接收一个具有默认值(1970/1/1)的对象。 客户端或服务器不会引发任何错误。 以前它适用于相应的BCL类型( DateTimeOffset )。 我理解NCF时间类型可能不会被WCF“知道”,但我看不出我应该如何添加它们。 我在关于已知类型的文档中检查了此页面 ,但它没有帮助。 有没有办法做到这一点,以避免BCL类型的脏(可能不完整)手动转换/序列化? 谢谢。

在特定时区找到LocalDate的最后可能瞬间的最佳方法是什么?

抱歉,如果这似乎是一个简单的问题,但我大多只是想检查我所拥有的解决方案对于所有情况都是最明智/最有效的。 我们使用的预先存在的SQL Server数据库存储’period’作为包含start – >包含结束UTC DateTime值。 (开始和结束列都是datetime2(7) ,在我们开始使用它们之前自动转换为DateTimeKind.UTC System.DateTime实例)。 因此,如果我需要存储“整天/月/年,给定用户的时区”,我需要找到“特定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)); } 我想我还需要避免(在任何其他地方)使用.AtLeniently(..) )映射“日期结束” LocalDateTime因为如果23:59:59.9999999被“跳过”并且在目标DateTimeZone中不存在,那么它将是映射到间隙00:00:00.000000的“外部”一侧的下一个可用时刻,这将给我一个独有的 ZonedDateTime值。 修订方法: public static LocalDateTime AtEndOfDay(this LocalDate localDate) { // TODO: Replace with […]

将日历相互转换使用NodaTime库

我使用Noda Time来处理DateTime问题,我阅读了几乎所有的文档,但是我有一些问题要将日历转换为彼此, 首先,Noda支持多少个日历? 正如CalendarSystem所说,只有4个日历: a)CopticCalendar / b)GregorianCalendar / c)IslamicCalendar / d)JulianCalendar 那么其他日历系统呢? 我使用波斯日历又称Jalali日历 ,所以有没有办法在NodaTime中使用这个日历? 以及如何将其转换为格里高利历? 我的最终目标是将时间(特殊区域)和日期转换为UTC时区和格鲁吉亚日历。 例如, 现在 ( yyyy/MM/dd – HH:mm:ss )在Asia/Tehran时区和波斯日历是:(1391/06/30 – 10:01:15)和现在在格鲁吉亚日历和UTC是(2012年) / 09/20 – 05:01:15),你的建议是什么? 时间单独根本不重要,但日期,我对它没有任何想法(在NodaTime中),有没有办法在一个过程或方法中转换这两个?

Noda Time:Period.Between返回不正确的值

我在使用NodaTime lib时遇到了麻烦。 我的目标:计算两个日期之间的年/月/日。 所以,这是我的测试示例: private static void Main() { var list = new List<Tuple> { new Tuple(new DateTime(1980, 1, 1), new DateTime(1983, 12, 31)), new Tuple(new DateTime(2009, 1, 1), new DateTime(2015, 01, 23)) }; var totalPeriod = Period.Zero; foreach (var tuple in list) { var dateFrom = tuple.Item1; var dateTo = tuple.Item2; var ld1 = […]

使用Nodatime将UTC时间转换为当地时间

我已经提供了这种格式“ddMMyyHHmmss”的时间。 我知道时间是UTC格式。 我想使用NodaTime库将其转换为我当地的时区,但我似乎无法弄明白。 我当地的时区目标是新西兰。 这是我尝试过的: var pattern = LocalDateTimePattern.CreateWithInvariantCulture(“ddMMyyHHmmss”); var parseResult = pattern.Parse(utcDateTime); if (!parseResult.Success) { throw new InvalidDataException(“Invalid time specified ” + date + time); } var timeZone = DateTimeZoneProviders.Bcl[“New Zealand Standard Time”]; var zone = new ZonedDateTime( localDateTime, timeZone, timeZone.GetUtcOffset(SystemClock.Instance.Now)); return new DateTime(zone.ToInstant().Ticks);

将NodaTime转换为Unix时间戳以及LocalDateTime的重要性

我目前正在使用NodaTime,这是基于我在C#的DateTime类中处理时区的挫败感。 到目前为止,我真的很高兴。 public static string nodaTimeTest(string input) { var defaultValue = new OffsetDateTime(new LocalDateTime(2000, 1, 1, 0, 0), Offset.Zero); var pattern = OffsetDateTimePattern.Create(“yyyy-MM-dd’T’HH:mm:sso”, CultureInfo.InvariantCulture, defaultValue); var result = pattern.Parse(input).Value; return result.ToString(); } 我有三个具体问题。 以上是我在dateTime字符串中解析的方法。 我有一个format字符串,它允许我如何解析输入。 我的问题是: 我的LocalDateTime(..)是什么关系? 我使用的方法是Matt Johnson的Stack 示例 ,他的日期是2000,1,1,0,0。 我觉得这很奇怪,因为我知道的大多数日期类都使用Epoch时间1970, 1, 1, 0 ,0 ,所以我改变了我的方法以包含Epoch日期,但输出是相同的: 如何将时间转换为Unix时间戳? 它似乎没有这样做的内置方法。 使用此方法: public static string nodaTimeTest6(string input, […]

使用ASP.NET Web API将表单yyyy-MM-dd的日期查询参数反序列化为noda time LocalDate对象

我正在调查使用NodaTime LocalDate来替换我们现有的BCL DateTime / DateTimeOffset类的使用。 由于我们对DateTime可论证的模糊行为的误解,我们在代码中遇到了许多与时区相关的问题。 为了充分利用NodaTime,我希望能够从YYYY-MM-DDforms的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; } } 的Global.asax.cs public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { // Web API configuration and services var formatters = GlobalConfiguration.Configuration.Formatters; var […]