如何在Bash中获取当前区域设置的一周第一天?
如何在Bash中获取当前区域设置下一周的第一天(周日或周一)?
部分区域设置对应的一周第一天示例:
- 周日:
en_US、pt_BR(巴西) - 周一:
en_GB、es_AR(阿根廷) - 周六:
ar_AE(阿拉伯联合酋长国)
我希望找到适用于类UNIX系统的跨平台解决方案。我了解可以通过glibc组件中的locale(1)命令获取当前区域设置信息,但相关文档(locale(5))让我有些困惑,或许存在比使用glibc更好的方案。
可行解决方案
1. 解析locale的星期名称列表(跨平台首选)
locale day会返回当前区域设置下的星期全称,以分号分隔,第一个元素就是一周的第一天:
# 获取一周第一天的名称 first_weekday=$(locale day | cut -d';' -f1) echo "当前区域一周第一天:$first_weekday"
这个方法在Linux、BSD(包括macOS)等绝大多数类UNIX系统上都能正常工作,无需依赖特定工具版本。
2. 利用cal命令提取日历表头
cal命令的输出会遵循当前区域的星期起始规则,表头第一列就是一周第一天:
# 提取cal输出的表头第一个星期名称 cal | head -n 1 | awk '{print $1}'
优点是直观易理解,缺点是部分小众系统的cal输出格式可能有差异,需要测试适配。
3. 解析locale的配置参数(glibc系统专用)
对于使用glibc的Linux系统,可以直接查询LC_TIME中的first_weekday参数,获取数字表示(0通常对应周日,1对应周一,以此类推):
# 获取一周第一天的数字标识 first_weekday_num=$(locale -k LC_TIME | grep '^first_weekday' | awk -F= '{print $2}' | tr -d ' ') # 映射为星期名称(示例) case $first_weekday_num in 0) echo "周日";; 1) echo "周一";; 6) echo "周六";; esac
注意:这个方法仅适用于glibc系统,BSD系系统不支持locale -k参数。
内容的提问来源于stack exchange,提问作者myrdd
相关产品推荐
相关产品推荐

