- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要有一个能够存储在数据库中的相对最小/最大日期验证,以便为每个客户定制应用程序。我认为 NodaTime.Period
是最佳选择,因为它能够指定年份。但是,NodaTime.Period
不提供将自身与另一个时期进行比较的方法。
为此验证提供的示例数据:
(注意:目前的要求是年/月/日不会在验证中合并)
验证是:
public Period RelativeMinimum { get; set; }
public Period RelativeMaximum { get; set; }
给定用户输入的日期(和现在):
var now = new LocalDate(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
var userValue = new LocalDate(date.Year, date.Month, date.Day);
var difference = Period.Between(userValue, now);
我有一个比较:
if(RelativeMinimum != null && difference.IsLessThan(RelativeMinimum))))
{
response.IsValid = false;
response.Errors.Add(MinimumErrorMessage);
}
正在使用扩展类:
public static class PeriodExtensions
{
public static bool IsLessThan(this Period p, Period p2)
{
return (p.Years < p2.Years) || (p.Years == p2.Years && p.Months < p2.Months) || (p.Years == p2.Years && p.Months == p2.Months && p.Days < p2.Days);
}
public static bool IsGreaterThan(this Period p, Period p2)
{
return (p.Years > p2.Years) || (p.Years == p2.Years && p.Months > p2.Months) || (p.Years == p2.Years && p.Months == p2.Months && p.Days > p2.Days);
}
}
虽然这种方法有效,但考虑到我的测试条件,我想知道为什么 @jon-skeet 没有实现它,并且立即不得不担心我遗漏了什么以及我应该使用什么替代方案?
最佳答案
周期不可比的主要原因是它们可以包含可变长度的组件。
两个为期一个月的时间段的天数不一定相同。例如,哪个更大:1 个月还是 30 天?如果月份是一月,则超过 30 天。如果月份是二月,则少于 30 天。
这同样适用于年份。有些是 365 天,有些是 366。
当然,所有这些都假设您使用的是公历。野田时间支持其他日历系统,这些系统也有类似的怪癖。
关于代码:
如果您想要 DateTime
中的 LocalDate
,请使用 LocalDateTime.FromDateTime(dt).Date
要获取当前日期,请使用 SystemClock.Instance.Now.InZone(tz).Date
DateTime.Now
相同,它使用运行代码的计算机的本地时区,则通过调用获取 tz
DateTimeZoneProviders.Tzdb.GetSystemDefault()
为了比较您所描述的问题类型,请考虑定义最小和最大天,而不是最小和最大周期。那么你就不会有这样的单位变化。你可以在这样的日子里得到不同:
long days = Period.Between(d1, d2, PeriodUnits.Days).Days;
我相信这样的事情会很适合你的用例:
public static bool IsDifferenceLessThan(LocalDate d1, LocalDate d2, Period p)
{
if (p.HasTimeComponent)
throw new ArgumentException("Can only compare dates.", "p");
if (p.Years != 0)
{
if (p.Months != 0 || p.Weeks != 0 || p.Days != 0)
throw new ArgumentException("Can only compare one component of a period.", "p");
var years = Period.Between(d1, d2, PeriodUnits.Years).Years;
return years < p.Years;
}
if (p.Months != 0)
{
if (p.Weeks != 0 || p.Days != 0)
throw new ArgumentException("Can only compare one component of a period.", "p");
var months = Period.Between(d1, d2, PeriodUnits.Months).Months;
return months < p.Months;
}
if (p.Weeks != 0)
{
if (p.Days != 0)
throw new ArgumentException("Can only compare one component of a period.", "p");
var weeks = Period.Between(d1, d2, PeriodUnits.Weeks).Weeks;
return weeks < p.Weeks;
}
var days = Period.Between(d1, d2, PeriodUnits.Days).Days;
return days < p.Days;
}
关于c# - 使用 NodaTime(或替代方法)比较期间的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30226705/
Nodatime 库中有工作日的概念吗? 我想要做的是以某种方式声明一个日历周有 5 个工作日,然后能够提出以下问题: 从 [任何给定日期] + 10 个工作日开始,什么是结束日期? 或者 从[这个日
我正在尝试学习如何在我的应用程序中使用 NodaTime,但找不到很多关于如何使用此库执行某些操作的示例。 鉴于: "2012/08/30 17:45:00" 的日期/时间文本 格式字符串是 "yyy
我使用的是最新版本的 NodaTime和 Mongo DB Official Driver .我有一个简单的 POCO 类,它使用 NodaTime 的 ZonedDateTime作为一些属性中 .N
目前,我正在尝试使用 JsonFormatters用于序列化 ISO 8601 中的字符串规范格式在我的启动配置中,但无法使其工作。 我的启动配置如下: services.AddMvcCore(
我在将时间值反序列化为 LocalTime 时遇到问题 - 当然,我是 NodaTime 的新手。我想导入一个以“HH:mm”格式列出时间的 Web 服务结果。除非我使用“hh:mm:ss.fff”格
我需要使用NodaTime计算两个日期之间的天数,并在时区中进行计算。 结束时间是基于日期的,其隐含的时间是一天结束时的午夜。该日期是一个时区。 开始时间是当前时间,但是我正在将其传递给函数,以便可以
我需要确定现在到下次出现本地时间之间的持续时间。这是我得到的: Duration GetDuration(IClock clock, LocalTime time, DateTimeZone zone
我有一种情况,相对时间对用户来说比绝对时间更重要。因此,能够快速说出“事件发生在 5 天 5 小时前”比“事件发生在 CDT 下午 1 点,现在是 5 天后 CST 下午 5 点”更重要。 我们以 U
我喜欢使用*Pattern命名空间中的各种NodaTime.Text类型来对格式和解析值进行Noda Time处理。但是,用户输入通常不如单一格式那么规则。例如,我们的应用程序使用时间格式"h:mm
我越来越了解NodaTime并且非常喜欢它。但是我还不太了解! 给定诸如“ 2014-04-08T09:30:18Z”的值,将这样的字符串解析为NodaTime Instant所需的步骤是什么? 谢谢
似乎 Nodatime 使用的时区数据库文件是按年份命名的,同一年内的版本以 a 递增字母 - 即“tzdb2019a.nzd”在我写这篇文章时是最新的,下一个版本将是“tzdb2019b.nzd”,
我正在使用 NodaTime,我以纪元以来的滴答形式存储时间信息。 但是,我想将自 unix 纪元以来的毫秒数传递回客户端浏览器,因此我可以构造一个 javascript Date() 对象。有没有办
我要求管理员选择一些 countries List和 Time for Alert对于该国家/地区列表的用户。 假设管理员选择 24/07/2014 09:00 AM在国家India,Malaysia
在 NodaTime 中,如何根据 tz 时区 ID 找到时区的长格式名称? 例如,如果我提供“America/Los_Angeles”,我应该返回“太平洋标准时间”。 最佳答案 生成“长格式”时区名
我有一些 LocalDateTime s,我需要根据定义的分钟列表将一天中的时间向上/向下舍入到最接近的分钟数。 例如,如果我有日期时间 2018-03-20T12:13:47 并且我必须将它舍入到下
为什么结果为periodBetween.Days和 substracted.Days不同的? 我可以看到一个 periodBetween.Months是 0 和 substracted.Months是
我想创建一个自定义(不存在的)时区,它遵循与欧洲/伦敦完全相同的规则,但唯一的区别是偏移量应为距 UTC -5 小时。 出于测试目的,这就是我正在尝试的。如何指定夏令时?或者这个实现是完全错误的?
我使用 Noda Time为了处理 DateTime 问题,我阅读了几乎所有 documents但是我在相互转换日历时遇到了一些问题, 首先,Noda支持多少种日历? 正如 CalendarSyste
我必须处理由各种外部系统发送的也包含一些日期的 XML 文档。 xs:date 允许向日期添加“时区”,即偏移量。例如。 “2017-06-02+03:00” 是有效值。此外,在单个 XML 文档中偏
我正在研究 writing a managed wrapper around Massachusetts Bay Transportation Authority (MBTA) Realtime AP
我是一名优秀的程序员,十分优秀!