使用Delphi找到给定周和年份的开始

3
我正在寻找一个Delphi(10+)函数,该函数返回给定年份和周数的TDate: function StartDate(2021, 53): TDate应返回2021-01-01。
虽然WeekOfTheYear(EncodeDate(2021,1,1))返回53(正确的),但我无法使用StartOfAWeek(2021,53,1)StartOfAWeek(2021,53,5)(5=星期五)进行反向操作 - 它不被识别为有效日期(=异常)。有什么建议吗?
编辑: 我正在寻找一个符合ISO 8601标准的函数(类似于内部Delphi例程),星期一=1,并考虑特殊的周(如2021-01-01),或者更准确地说: WeekOfTheYear的“反向”例程。

使用哪种算法来确定周数?我知道至少有两种(美国和欧洲)。而且,应该返回哪一天作为一周的第一天呢?是星期日(如美国所用)还是星期一(如欧盟所用)?这并不是一个简单明了的问题... - HeartWare
1
第53周?你来自哪里? :) 如果你指的是将给定年份增加53周,那么应该是2022-01-01而不是2021-01-01 - Victoria
是的,在你的例子中,2021年的第53周实际上是在2022年初。 - David Heffernan
@DH:那么2021年1月1日是第几周呢? - cydo
看起来我错了。但这意味着我无法将2020年第53周映射到2021-01-01,因为它也可能是2020-12-28。 - cydo
显示剩余6条评论
1个回答

7
您需要的函数是:
StartOfAWeek(Year, Week, 1)

你注意到 StartOfAWeek(2021, 53, 1) 抛出了异常。这是正确的,因为 2021 并没有 53 周,只有 52 周。第 52 周在 2021 年的最后一天结束。
你对以下结果感到困惑。
WeekOfTheYear(EncodeDate(2021,1,1))

这个返回值是53,但由于日期在年初,这是2020年的第53周。


我有点混淆了。但是我的意思是我找不到2020年第53周的开始日期——是星期一还是星期五。 - cydo
2020年12月28日是Y2020W53,而2021年1月1日也是Y2020W53,因此仅凭Y2020W53无法确定对应的年份。我放弃了。 - cydo
我正在访问一个数据库,其中存储每周的日历。我现在发现它有两列Year;Week,存在两行,一行是2020;53,另一行是2021;53 - 我试图返回这些信息的TDate,并且遇到了最后一个问题。没有考虑到2021;53并不完全有效,那个数据库中应该只有一行。好的,搞定了。 - cydo
使用2020;53参数调用该函数应返回2020-28-12,使用2021;53参数应返回2021-01-01,但我现在相当有信心自己解决它,只是对2021;53条目感到困惑。谢谢。 - cydo
如果这是您想要的功能,那么它不遵循任何标准,我完全预料到您正在设计一个系统,在该系统中第53周比一年中的所有其他周都要早,这将会在未来带来问题。 - David Heffernan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接