标签: nodatime

如何使用Noda Time解析多种格式?

我喜欢Noda Time使用命名空间中的*Pattern各种类型处理格式化和解析值NodaTime.Text.但是,用户输入通常不像单个格式那样规则.例如,我们的应用程序使用时间格式,"h:mm tt"但我们希望能够以下列任何格式解析用户输入:

  • h:mm tt
  • h:mmtt (没有空间)
  • h:mm t
  • h:mmt (没有空间)
  • h tt
  • hh:mm
  • 等等...

有没有办法使用Noda Time来解析可能有多种格式的输入?

nodatime

9
推荐指数
1
解决办法
560
查看次数

将NodaTime DateTimeZone转换为TimeZoneInfo

我正在使用NodaTime,因为它对zoneinfo数据有很好的支持,但我有一个案例需要将其DateTimeZone转换TimeZoneInfo为在Quartz.NET中使用.

这里推荐的方法是什么?IANA在Windows时区和zoneinfo时区之间有一个映射文件,我可以创建一个利用此信息的扩展方法吗?

谢谢,迪恩

nodatime

9
推荐指数
2
解决办法
4093
查看次数

你如何处理.net中的"模糊时间"?

我需要将来自不同时区的'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聊天讨论的链接.

c# timezone nodatime

9
推荐指数
1
解决办法
2039
查看次数

如何在NodaTime中准确表示日期范围?

目标

我有一个LocalDate项目列表,代表开始日期和结束日期的集合.

我希望能够存储日期范围,以便我可以对它们进行操作,作为一组重叠或不同的范围等.

问题

  • NodaTime是否提供了我在文档中遗漏的某种DateRange构造?
  • 我在想这个错吗?有没有更自然/首选的方法来实现NodaTime已经允许的?
  • 我是否通过尝试使用LocalDate考虑日期范围作为开始日期和结束日期来解决问题?

我对NodaTime完全不熟悉,并认为这对我来说是一个概念上的误解.

更新:我从2009年开始注意到关于这个主题的类似问题,但这似乎是指另一个实用类; 我假设从那时起NodaTime可能已经发展到适应这种情况.

.net c# nodatime

9
推荐指数
1
解决办法
1755
查看次数

使用JSON.NET反序名化Noda Time的LocalDateTime

我正在尝试使用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)

c# datetime date json.net nodatime

9
推荐指数
1
解决办法
3048
查看次数

验证System.DateTime是UTC格式

我要求存储数据库中记录的所有日期必须记录为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.

c# timezone nodatime

9
推荐指数
1
解决办法
1万
查看次数

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

抱歉,如果这似乎是一个简单的问题,但我大多只想检查我所拥有的解决方案对于所有情况都是最明智/最有效的.

我们使用的预先存在的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)

c# nodatime

9
推荐指数
1
解决办法
541
查看次数

使用NodaTime从时区(字符串)获取偏移分钟

如果我只有一个表示时区的字符串,那么获取分钟的最简单方法是什么?(例如"欧洲/伦敦")

到目前为止,我有:

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之间.

.net c# nodatime

9
推荐指数
1
解决办法
1969
查看次数

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

我正在研究使用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?

c# asp.net-web-api nodatime

8
推荐指数
1
解决办法
1394
查看次数

如何获取用作时区初始值设定项的tzdb中的字符串列表?

所以我是NodaTime的新手,并尝试使用它来使用DateTimeZone对象存储时区信息.

我在下面的示例中看到了用户指南等,这给了我一个很好的来自tzdb的DateTimeZone对象.

var london = DateTimeZoneProviders.Tzdb["Europe/London"];
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 如何获得tzdb中使用的时区字符串列表("Europe/London").我环顾四周,无处可寻.在某处我可以参考标准清单吗?这是如何运作的?恩. - 我应该为EST传递的字符串是什么?

谢谢!

nodatime

8
推荐指数
1
解决办法
2800
查看次数

标签 统计

nodatime ×10

c# ×7

.net ×2

timezone ×2

asp.net-web-api ×1

date ×1

datetime ×1

json.net ×1