【问题标题】:Amount of weeks between 2 iso8601 dates2 个 iso8601 日期之间的周数
【发布时间】:2016-12-16 15:16:12
【问题描述】:

您如何仅使用周数和年份数来计算 2 个 ISO8601 日期之间的周数?

输入: 第一年 第1周 第 2 年 第2周

输出: 符合 ISO8601 的周数

我可以计算一年中的周数:

public static int AmountOfWeeksInYearIso8601(this DateTime dateTime)
{
    var year = dateTime.Year;
    var g = Math.Floor((year - 100d) / 400d) - Math.Floor((year - 102d) / 400d);
    var h = Math.Floor((year - 200d) / 400d) - Math.Floor((year - 199d) / 400d);
    var f = 5 * year + 12 - 4 * (Math.Floor(year / 100d) - Math.Floor(year / 400d)) + g + h;

    return f % 28 < 5 ? 53 : 52;
}

【问题讨论】:

  • 这有点令人困惑,因为周数和年份不能构成一个日期 - 你能再澄清一下你的问题吗?
  • @stuartd "allowing for the years" 足以让这件事变得不平凡:它需要弄清楚哪些年份有 52 周,哪些年份有 53 周。
  • @stuartd 在 ISO 周编号中,可能会落在下一年的第 1 周。
  • @hvd 好的,我放弃了 :)
  • @Liam 这是关于 ISO 8601 年-月-日格式,而不是 ISO 8601 年-周格式。相同的 ISO 标准,非常不同的问题。 :)

标签: c# datetime iso8601


【解决方案1】:

创建与两周的星期一对应的DateTime 值。请参阅Calculate date from week number 了解如何执行此操作。减去这些以获得差异为TimeSpan。请求其Days 属性以获取天数的差异。除以 7 得到周数的差值。

【讨论】:

  • 顺便说一句。在大多数情况下,这也肯定比迭代快。根据stackoverflow.com/a/8724110/1336590 中的建议检查year % 400 与哈希集相比,对于小于约30 年的差异,速度会稍快一些。在那之后,迭代变得越来越慢,而这似乎有恒定的执行时间。
猜你喜欢
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多