我的公司构建了报告工具,导出格式之一是 excel。由于我们的客户来自不同的国家/地区,因此在生成 excel 文件时,我们使用区域设置格式来显示日期,格式如下:
[$-<locale here>]mmmm d, yyyy;@
因此,如果单元格中的日期为 31/03/2020 且区域设置为爱尔兰,则它会显示为 2020 年 3 月 10 日,但如果区域设置为西班牙,则它会显示 2020 年 3 月 10 日
我们收到一位客户报告称,该系统无法正常工作,因为他们的日期 2020 年 3 月 31 日显示为 2020 年 3 月 8 日
经过仔细检查,我发现它们的格式化程序列为:
[$-,F]mmmm d, yyyy;@
我尝试查找 Excel 到底试图解析什么,或者试图使用什么日历或日期格式化程序来显示该虚假日期,但都无济于事。我们显然需要更好地识别客户的语言环境,但我想知道这是否可能是由于客户的计算机语言环境奇怪或只是一些虚假代码造成的。
这发生在 Excel 2013 中,但我也能够在 Excel 365 上重现它。我还尝试找到与 F 的十六进制值相关联的任何国家代码,但都无济于事。当,
删除时,格式化程序将 F 识别为法国的代码,并以法语显示正确的日期数字:2020 年 3 月 30 日。
答案1
据我所知[$-,F]
,这相当于[$-F0000]
将日期转换为农历。
我想看看在相同情况下其他字母代表什么,所以我写了这个:
Sub formatdates()
Dim ws As Worksheet
Set ws = Sheet1
Dim i As Integer
i = 1
Do While i < 27
ws.Cells(i, 1) = "=TODAY"
ws.Cells(i, 1).NumberFormat = "[$-," & Chr(64 + i) & "]dddd, mmmm dd, yyyy"
ws.Cells(i, 2) = "[$-," & Chr(64 + i) & "]dddd, mmmm dd, yyyy"
ws.Cells(i, 3) = ws.Cells(i, 1).NumberFormat
i = i + 1
Loop
End Sub
您可以在任何空白工作簿中使用它。它将使用罗马字母表中的每个字母作为格式代码显示当前日期,格式代码的使用方式类似于您帖子中的 [$-,F]。我相信还有更多,但这些已经足够有启发性,值得进行一些挖掘。
例如
- [$-,F] 将为您提供农历,但以英文显示,例如第五个月显示为六月
- [$-,G] 会给你印度民事历法(我认为)
- [$-,M] 会给你波斯历法(我认为)
- [$-,N] 将为你提供伊斯兰历
我还参加了语言代码列表来自@DavidPostill 在他的评论中包含的链接(有有其他更完整的列表国家代码(我认为也可以使用)。
我将上面注释中的链接中的代码表放入 Sheet2 中,并将其附加到使用上面第一个函数创建的表格的底部,只是出于兴趣。
Sub formatdates2()
Dim ws As Worksheet
Set ws = Sheet1
Dim i As Integer
Dim r As Integer
r = 1
i = 28
Do While Sheet2.Cells(r, 1) <> ""
ws.Cells(i, 1) = "=TODAY()"
ws.Cells(i, 1).NumberFormat = "[$-" & Sheet2.Cells(r, 1) & "]dddd, mmmm dd, yyyy"
ws.Cells(i, 2) = "[$-," & Sheet2.Cells(r, 1) & "]dddd, mmmm dd, yyyy"
ws.Cells(i, 3) = ws.Cells(i, 1).NumberFormat
ws.Cells(i, 4) = Sheet2.Cells(r, 2)
i = i + 1
r = r + 1
Loop
End Sub
据我所知,有语言代码(后者列表/功能)和日历代码(前者功能)。
我认为您正在寻找语言代码。
但是您可能更愿意使用[$-x-sysdate]
,这是当我在“设置单元格格式”对话框的“日期”列表中选择所需格式,然后在“自定义”列表中查看相同格式时显示的代码。