Access 2010如何获取3月和10月的最后一个周日?
解决Access 2010中BST到GMT的日期转换问题
我来帮你搞定这个问题!英国夏令时(BST)和格林尼治标准时间(GMT)的切换规则是固定的:3月最后一个周日凌晨1点(GMT)开始转BST,10月最后一个周日凌晨1点(GMT)转回GMT。我们可以用Access VBA写几个函数来自动计算这两个关键时间点,再完成日期转换。
第一步:编写计算BST切换时间的函数
先打开Access的VBA编辑器(按Alt+F11),插入一个新模块,添加下面两个函数,用来获取指定年份的BST开始和结束时间(都是GMT时间):
获取BST开始时间(GMT)
Function GetBSTStart(intYear As Integer) As Date ' 计算3月最后一个周日的凌晨1点(GMT) Dim dtLastSunMar As Date ' 先取3月31日,再往前推到最近的周日 dtLastSunMar = DateSerial(intYear, 3, 31) - (Weekday(DateSerial(intYear, 3, 31), vbSunday) - 1) ' 加上1小时,得到BST开始的GMT时间点 GetBSTStart = dtLastSunMar + TimeSerial(1, 0, 0) End Function
获取BST结束时间(GMT)
Function GetBSTEnd(intYear As Integer) As Date ' 计算10月最后一个周日的凌晨1点(GMT) Dim dtLastSunOct As Date ' 先取10月31日,再往前推到最近的周日 dtLastSunOct = DateSerial(intYear, 10, 31) - (Weekday(DateSerial(intYear, 10, 31), vbSunday) - 1) ' 加上1小时,得到BST结束的GMT时间点 GetBSTEnd = dtLastSunOct + TimeSerial(1, 0, 0) End Function
第二步:写核心的GMT转换函数
接下来是主函数,它会判断你的输入日期是否处于BST时段,然后自动转换:
Function ConvertToGMT(dtInput As Date) As Date Dim intYear As Integer Dim dtBSTStart As Date Dim dtBSTEnd As Date intYear = Year(dtInput) dtBSTStart = GetBSTStart(intYear) dtBSTEnd = GetBSTEnd(intYear) ' 判断逻辑:如果输入时间在BST开始之后、结束之前,就减1小时转GMT;否则直接返回 ' 注意:10月最后一个周日凌晨1点及之后已经是GMT,所以不用减 If dtInput >= dtBSTStart And dtInput < dtBSTEnd Then ConvertToGMT = dtInput - TimeSerial(1, 0, 0) Else ConvertToGMT = dtInput End If End Function
第三步:在Access里使用这个函数
你可以在多个场景用它:
- 查询中:添加一个计算字段,比如
GMT日期: ConvertToGMT([你的日期字段名]),运行查询就能得到转换后的GMT日期 - VBA代码里:直接调用,比如
Dim myGMTdate As Date: myGMTdate = ConvertToGMT(Now()) - 窗体/报表:绑定控件的数据源可以设置为这个函数,实时转换显示
小提示
- 如果你的日期字段只有日期(时间部分为0:00),转换逻辑依然有效:比如3月最后一个周日当天0:00属于GMT,1:00及之后属于BST,转换后会自动减1小时
- 跨年份的日期也不用操心,函数会自动获取对应年份的BST切换时间
内容的提问来源于stack exchange,提问作者EnMo
相关产品推荐
相关产品推荐

