【问题标题】:How to find the week number of a given date in Visual Basic 6?如何在 Visual Basic 6 中查找给定日期的周数?
【发布时间】:2016-08-31 20:46:22
【问题描述】:

有没有人在 vb6 中返回给定日期的周数的工作函数?

这曾经有效:

Dim W As Integer

W = Format(DateSerial(2010, 1, 1), "ww", vbMonday, vbFirstFourDays)

但在 Windows 8.1 中,您现在会得到“堆栈空间不足”。

【问题讨论】:

  • 知道我们应该继续使用 XP!
  • 使用DatePart 函数,而不是Format$(并且永远不要使用Format)。
  • 这很奇怪,但我在 8.1 上尝试过,DatePart("ww", DateSerial(2010, 1, 1), ... 有效。 Format(CDate("1/1/2010"), "ww", ... 也可以。但是Format(DateSerial(... 会导致堆栈空间不足错误。
  • @jac:您是否尝试过先将日期分配给变量,然后再分配给Formatting?
  • @Westie 我没有尝试过。这不是我的问题,所以我并没有足够在意去挖掘那么深,这是一个很容易解决的问题。我只是觉得它很好奇,并且没有进行任何实际调查,我认为它与 DateSerial 函数返回一个 date 类型的变体以及 Format 语句也返回一个变体有关。

标签: vb6 windows-8.1


【解决方案1】:

考虑到偏移量,答案有点复杂

以下功能应该可以很好地满足您的需求。只需向它传递一个有效的 Date 对象,它就会返回一个 Integer of the Week 数字。

Private Function Week(dteValue As Date) As Integer
   'Monday is set as first day of week
   Dim lngDate As Long
   Dim intWeek As Integer

   'If january 1. is later then thursday, january 1. is not in week 1
   If Not Weekday("01/01/" & Year(dteValue), vbMonday) > 4 Then
      intWeek = 1
   Else
      intWeek = 0
   End If
   'Sets long-value for january 1.
   lngDate = CLng(CDate("01/01/" & Year(dteValue)))

   'Finds the first monday of year
   lngDate = lngDate + (8 - Weekday("01/01/" & Year(dteValue), vbMonday))
   'Increases week by week until set date is passed
   While Not lngDate > CLng(CDate(dteValue))
      intWeek = intWeek + 1
      lngDate = lngDate + 7
   Wend
   'If the date set is not in week 1, this finds latest week previous year
   If intWeek = 0 Then
      intWeek = Week("31/12/" & Year(dteValue) - 1)
   End If
   Week = intWeek
End Function

此代码由FreeVBCode.com 提供(包括为原作者提供属性的参考)。

【讨论】:

  • @finch - 2014 年 12 月 29 日,不是第一周。
  • 根据 ISO 对周数的定义,2014 年 12 月 29 日是 2015 年的第一周。请参阅 Wikipedia article on ISO week numbering。一个挑战是同意哪个周数是必需的。讨论中没有明确解决这个问题。
  • @finch - 这是 2014 年的最后一周.....首先。使用你的大脑 > 维基百科。那个日期是哪一年,.... 2015 年 ... 或 2014 年 .... 那么,为什么计数器会在 2014 年中 1 日开始。无论如何,如果它真的让您感到困扰,那么简单的解决方法是“如果intWeek > 52 然后 intWeek = intWeek - 52" ...这是错误的。函数返回一个 int 值...如果您在 2014 年传递了某个日期...它将返回 2014 年的哪一周 --- 如果它在第 354 天返回 1,那么它会是错误的,因为第 1 周是第 1 天仅-7。任何进一步的事情,你只是在拖钓。
  • 我指定了 ISO 周数,而不是其他周编号系统。我提到的文章说一年的第一周是包含一年中第一个星期四的那一周(因此,总是包含 1 月 4 日)。由于 2014 年 12 月 29 日是星期一,2015 年 1 月 1 日是星期四,因此本周包含一年中的第一个星期四,在 ISO 周编号系统下是 2015 年的第一周。其他周编号系统可能会分配不同的周数字。这就是为什么问题需要定义我们想要哪种周编号系统?
猜你喜欢
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 2012-02-05
  • 2022-08-03
相关资源
最近更新 更多