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

本文关键字:NodaTime 对象 字符串 日期 | 更新日期: 2023-09-27 18:20:09

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

我有这个片段和这个场景,用户只能输入date,比如06/11/2015,然后在将其保存到数据库时,我需要它的当前时间(用户的当前时间)来查看。我之所以将其转换为long,是因为我使用的是实体框架。

这样做明智吗?

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

我将从稍微不同的角度回答。您说要转换为long是因为您使用的是实体框架。这可能没有必要。

听起来你只是想在一个日历日期来回旅行。如果没有涉及特定的时间(如午夜或一天的开始),并且您希望所有用户都能看到同一年、同一个月和同一天,无论他们在哪个时区,那么(IMHO)最好在整个过程中保持这些条件。

有些人会反对这一点,通常的最佳实践是"始终存储在UTC",但这一建议在两种常见情况下都不成立:

  1. "我有一个当地的日期和时间,但它们是在未来,我将它们用于日程安排。"

  2. "我只是在使用一个没有任何时间的日历日期,它可能是过去、现在或未来,但它是一个以人为中心的民事日期,而不是一个独特的时刻。"

你似乎处于第二种情况。因此:

  • 在数据库中使用仅限日期的类型,例如SQL Server、PostgreSQL、MySQL、Oracle和大多数其他关系数据库中的DATE类型。

  • 在Noda Time中使用LocalDate类型。不要尝试将其转换为InstantLocalDateTimeZonedDateTimelong

  • 使用DateTime类型(带有.Kind == DateTimeKind.Unspecified)作为数据库和LocalDate属性之间的中介。这通常是通过"好友属性"模式来完成的,如这个答案所示。