【问题标题】:How do you obtain a formatted date and time for the current locale in C?如何获取 C 中当前语言环境的格式化日期和时间?
【发布时间】:2011-02-16 05:28:40
【问题描述】:

我应该调用什么 C 函数来获取程序正在执行的语言环境的格式化日期和时间?

我问这个问题是因为我在使用 ClamAV 守护程序 API 时遇到了问题。 VERSION 命令返回最新病毒定义的日期和时间,但代码使用对ctime 的调用来格式化它。据我所知,ctime 没有根据当前区域设置格式化日期时间,而是在返回的字符串中使用英文缩写表示星期几和月份。这会导致问题,因为我的 Java 程序使用 ClamAV API确实尊重当前的语言环境,因此希望星期几和月份名称具有本地缩写。

日期时间格式需要与ctime生成的格式相同:

Www Mmm dd hh:mm:ss yyyy

其中 Www 是工作日,Mmm 是月份,dd 是月份中的日期,hh:mm:ss 是时间,yyyy 是年份。

我可以重写 Java 程序以始终假定英文日期,但我更乐意向 ClamAV 提交补丁,因为这对我来说似乎是他们这边的一个错误。

【问题讨论】:

  • 是的,ctime 不会创建本地化的日期/时间字符串,它会调用 asctime 来创建美国格式的字符串,但您为什么认为这是一个错误?我认为如果有一些实用程序可以解析日期/时间字符串以比较日期,那么保持一种格式会更容易(即使数字版本会更好)。
  • 但这意味着所有使用非美国语言环境的 ClamAV API 用户都必须使用美国语言环境专门解析日期。这在 Java 中很容易做到,但在其他语言中可能很难做到?手动操作会很烦人,特别是如果您不会说英语并且必须查找所有名称和缩写。
  • 话虽如此,我可能会修改我们的代码并提交错误报告/补丁,看看 ClamAV 开发人员怎么说。
  • 如果 ClamAV API 以独立于语言环境的格式提供日期/时间,这似乎是最好的 - 就像一个很好的旧 UNIX 纪元时间戳。
  • 由于当前 VERSION 命令不带任何参数,您可以添加可选的“tsformat=UNIX”参数或类似参数。

标签: c datetime formatting locale ctime


【解决方案1】:

strftime("%c", ... 应该为您提供当前语言环境的首选日期和时间表示。或者(仍然使用strftime)您可以模拟ctime 的格式,但使用%b 表示当前语言环境的月份缩写,%a 表示当前语言环境的工作日缩写,等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 2020-04-29
    相关资源
    最近更新 更多