2015-11-01 54 views
5

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

我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 to 
// long data type then save it to the database 

// methods 
private LocalTime GetTimeOfDay() 
{ 
    var instant = SystemClock.Instance.Now; 
    var tz = DateTimeZoneProviders.Tzdb["Asia/Hong_Kong"]; 

    return instant.InZone(tz).TimeOfDay; 
} 

我有这样的片段,并这种情况下,用户可以只输入date06/11/2015然后在它保存到数据库中,我需要它的当前时间(用户的当前时间)用于查看目的。我将其转换为long的原因是因为我正在使用实体框架。

这是可取的吗?

+0

编辑问题 - 为什么你会让他们在这种情况下输入日期?这听起来像是用当前的日期和时间对订单进行时间戳。 –

+0

@MattJohnson这只是一个想法,我想出了。我只是意识到它没有任何意义。我想我需要删除它。 –

+0

是的,如果你只是时间戳,那么其余的都不适用,因为你只是使用'SystemClock.Instance.Now'来获取当前基于UTC的'Instant'。或者在数据库中使用'DateTime.UtcNow'或类似的函数,然后根本就不需要Noda Time。 –

回答

5

我会从略有不同的角度回答。你说你正在转换为long,因为你在使用实体框架。这可能没有必要。

这听起来像你只是想往返日历日期。如果没有特定的时间(比如午夜或者开始),并且你希望所有的用户不管他们在哪个时区看到同一年的每一天,那么它会更好(恕我直言)在整个过程中保持这些条款。

有人会反对这一点,与普通的最佳实践是“总是UTC存储”,但这个建议并没有在两种常见情况托起:

  1. “我有个地方日期和时间,但他们在未来,我将它们用于计划目的。“ “我只是在没有任何时间的日历上工作,它可能已经过去了现在或将来,但它是一个以人为中心的民事日期,而不是一个独特的瞬间。“

你似乎是在第二种情况下这样:

  • 使用日期,只输入您的数据库,如SQL服务器,PostgreSQL的可用DATE类型, MySQL和甲骨文,和其他大多数关系型数据库。

  • 使用在Noda时间LocalDate类型。不要试图将其转换为InstantLocalDateTimeZonedDateTimelong

  • 使用DateTime类型(与.Kind == DateTimeKind.Unspecified)充当数据库和LocalDate属性之间的中介。这通常通过“好友属性”模式来完成,如in this answer所示。

+0

请注意,我在回答中提出了几个假设。如果你实际上不只是试图绕过日历日期,那么请告诉我,我会删除或修改我的回复。谢谢。 –

+0

哦,所以我可以使用类似你的方法来使用'DATE'并将'DATE'只存储在数据库中,而不用担心“总是以UTC存储”的规则?我一直认为,根据我阅读的内容,应该始终以UTC存储。我从来没有想过有一个例外。我不确定'日历日期'是什么。 –

+0

是的,这就是我的意思。 “往返”是您获得您保存或传输的确切数值的想法。它以字符串“2015-11-01”开始,以“2015-11-01”的形式保存到数据库,并且可以使用相同的值从数据库加载。 (不会往返的东西就像是设置'DateTimeKind.Utc',它不会保存到数据库中,所以在返回时将会是'DateTimeKind.Unspecified'。) –