标签: nodatime

使用NodaTime计算包容性天数

例如,如果我有以下代码:

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)

c# datetime nodatime

6
推荐指数
1
解决办法
1560
查看次数

DateTimeZone到/来自数据库

我正试图让Jon Skeet(以及其他人)使用Noda Time框架.

如何存储DateTimeZone并从数据库中检索它.我认为Id属性值可能是设置为数据库的值,但是如何从Id创建DateTimeZone,因为DateTimeZone是一个抽象类?

c# nodatime

6
推荐指数
1
解决办法
272
查看次数

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

我有一个在OperationContract参数中使用Noda Time类型(LocalDateZonedDateTime)的服务,但是当我尝试发送时,例如LocalDate(1990,7,31)服务器收到一个具有默认值(1970/1/1)的对象.客户端或服务器不会引发任何错误.

以前它适用于相应的BCL类型(DateTimeOffset).我理解NCF时间类型可能不会被WCF"知道",但我看不出我应该如何添加它们.我在关于已知类型的文档中检查了此页面,但它没有帮助.

有没有办法做到这一点,以避免从BCL类型到BCL类型的手动转换/序列化(可能不完整)?

谢谢.

c# service wcf date nodatime

6
推荐指数
1
解决办法
727
查看次数

NodaTime Interval JSON序列化

有没有理由说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中的区间概念?

json iso8601 nodatime

6
推荐指数
1
解决办法
466
查看次数

从字符串值中检索可能的DateTime格式的列表

我希望能够从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)

c# datetime nodatime

6
推荐指数
1
解决办法
1711
查看次数

如何将日期字符串解析为NodaTime对象?

我是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)

但我不确定我是否走在正确的道路上.

这就是我真正想要的.

  1. dateInput使用以下格式将(日期字符串)转换为NodaTime对象dd/MM/yyyy
  2. 然后将其作为UTC然后转换为long数据类型,然后将其保存到数据库
  3. 然后尝试检索已保存的数据,然后使用特定的时区.说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)

c# datetime date nodatime

6
推荐指数
1
解决办法
3148
查看次数

使用JSON.NET和NodaTime从JSON反序列化LocalTime导致NodaTime.Text.UnparsableValueException

我有一个问题将时间值反序列化为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)

c# json json.net deserialization nodatime

6
推荐指数
1
解决办法
762
查看次数

这是在Nodatime之间转换时区的正确方法吗?

目标是创建一个函数,使用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)

c# nodatime

6
推荐指数
1
解决办法
1523
查看次数

将System.DateTime转换为NodaTime.ZonedDateTime

我有一个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点的节目.我该怎么做呢?

c# nodatime

6
推荐指数
1
解决办法
3233
查看次数

使用Noda Time解析不明确的日期时间

我使用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的哪个“版本”,并且因此引发了异常。

对我来说,解析产生的时间版本并不重要,我只想避免出现异常,并获得尽可能接近实际的日期。一小时或更短的时间可以。最好的方法是什么?

我能想到的唯一方法是拆分字符串并分别解析各个部分,然后再添加一个小时,但这感觉是完全错误的。有更好的解决方案吗?

.net c# nodatime

6
推荐指数
1
解决办法
369
查看次数

标签 统计

nodatime ×10

c# ×9

datetime ×3

date ×2

json ×2

.net ×1

deserialization ×1

iso8601 ×1

json.net ×1

service ×1

wcf ×1