vb.net - 获取或将一年中的一周转换为 ISO 周

标签 vb.net

在尝试获取一年中的周数时,我尝试了以下方法:

maxWeek = calendar.GetWeekOfYear(New Date(t_year, 12, 31), 
          CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)

这不符合我的目的,但我注意到一些奇怪的事情。对于 2014-12-31,它返回 53,对于 2015-01-01,它返回 1。对于 2015-01-05,它返回 2。这意味着第 53 周和第 1 周小于 7 天!

我需要的结果是 ISO Week合规。我在网上找不到任何遵循相同逻辑的日历示例。它们都显示了从 2014-12-29 到 2015-01-04 的第 1 周。

最佳答案

您的原始帖子没有提到您正在寻找 ISO 周,这可能使您不清楚想要什么。

GetWeekOfYear使用 FirstFourDayWeekDayOfWeek.Monday几乎就像一个 ISO 周。不同之处在于 ISO 周始终为 7 天。请记住,ISO 日期不仅是一种不同的格式,而且是一种具有其自身条件的不同日历(例如闰周)。另一方面,您的默认 NET 日历是 Gregorian。

将 NET WOY 调整为 ISO 周并不难:

Public Shared Function GetISOWeekOfYear(dt As DateTime) As Integer
    Dim cal As Calendar = CultureInfo.InvariantCulture.Calendar
    Dim d As DayOfWeek = cal.GetDayOfWeek(dt)

    If (d >= DayOfWeek.Monday) AndAlso (d <= DayOfWeek.Wednesday) Then
        dt = dt.AddDays(3)
    End If

    Return cal.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)

End Function

12/31/xxxx 的简单测试仪:
For n As Integer = 1990 To 2016
    Console.WriteLine("{0}: week:{1}", n.ToString,
                      GetISOWeekOfYear(New DateTime(n, 12, 31)).ToString)
Next

最后几个的输出:

2005: week:52
2006: week:52
2007: week:1
2008: week:1
2009: week:53
2010: week:52
2011: week:52
2012: week:1
2013: week:1
2014: week:1
2015: week:53
2016: week:52

关于vb.net - 获取或将一年中的一周转换为 ISO 周,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27744923/

相关文章:

vb.net - 如何让我的程序在启动时运行?

c# - 如何将数组转换或复制到链表?

c# - VB.net 到 C# 等效于 "AddressOf"

vb.net - 字符串随机发生器

c# - FlowLayoutPanel 中文本框的自动宽度

c# - 将 DLL 注入(inject)目标进程 VB.NET

vb.net - 使用 VBScript 和 Azure Key Vault 从 Azure Web App 访问 Azure SQL 数据库

sql - 我应该将枚举存储在数据库级别还是应用程序逻辑 (.NET) 中?

.net - 在单行 lambda 表达式中使用 function 而不是 sub 导致的错误

mysql - 连接必须有效并在 vb 2008 中打开