【问题标题】:How to format date in SQLite according to current locale format settings?如何根据当前的语言环境格式设置在 SQLite 中格式化日期?
【发布时间】:2010-02-23 14:22:28
【问题描述】:

我需要使用 LIKE 运算符匹配日期。日期应该是当前用户的本地格式,而不是通用格式。

所以我像这样使用 strftime 函数:

WHERE strftime('%d.%m.%Y %H:%M', createdDate, 'localtime') LIKE '%{searchTerm}%'

不幸的是,这只适用于固定格式 '%d.%m.%Y %H:%M'。但我想使用用户当前的语言环境格式。

所以我需要: 1) 从 C++ 语言环境对象中获取 strftime 格式字符串 2) 使用当前语言环境本身使 SQLite 格式化日期

已经花费了几个小时无济于事。 如果有人能指出我如何解决这个问题的正确方向,我将不胜感激。

示例: 鉴于当前的语言环境是德语,我想得到类似“%d.%m.%Y %H:%m”的东西。 对于美国语言环境,我想获得 "%m/%d/%Y %H:%m"

【问题讨论】:

    标签: c++ datetime sqlite formatting locale


    【解决方案1】:

    通常可以使用 Windows GetDateFormat API(或用于 Vista 的 GetDateFormatEx API)获取本地日期格式。您的程序可以询问 API,然后相应地转换日期。之后,可以在 SQLite 中记录日期。

    但是,一旦以特定格式存储时间戳可能会产生疑问。这基本上意味着需要大量代码来操作每个日期,或者根本不需要日期操作。如果可能的话,我是否可以建议以纯格式(例如 ISO 或 UNIX 时间戳)存储并从中工作,以所需的任何风格的 GetDateFormat 输出?

    【讨论】:

    • 我已经以 '2010-02-25 11:19' 格式存储,我只是希望用户使用 LIKE 在他的本机格式上按日期搜索,我不知道该怎么做.
    • 那么你应该让你的框架来做。例如,如果您使用 .NET DateTimePicker,它会以本地格式向用户显示时间,但内部时间采用传统格式。您获得内部时间并基于该时间运行查询。即使对于 LIKE 子句,将其包装在控件中也比记录在数据库中要好。更容易维护。
    • 所以你的意思是我需要尝试转换用户输入的部分日期,然后运行 ​​LIKE 搜索?搜索是增量的,并且在每次击键后完成,我怀疑是否有一种简单的方法可以做到这一点..
    • 这只是一个建议。 GetDateFormatEx API 仍然是一种可能性,也许您可​​以将其结果构建到您的查询中。但是,我是一个数据库纯粹主义者,我的规则是如果您可以从同一条目的另一个字段中派生它,则不要记录它。你的 GUI 控件是什么?它是一个蒙面字段吗?您是否始终信任用户以正确的格式输入无人看管的日期?如果您有掩码,则可以确定正在填充哪些部分,并从中构建部分 ISO 日期,然后在 LIKE 查询中运行 that。将结果转换为本地并显示。
    • 这是一个简单的编辑控件,如果用户犯了错误将没有匹配,仅此而已。我想可以用本地化日期预先填写一个 TEMP TABLE,然后对其进行 LIKE 搜索?最多将有大约 2x100,000 条时间记录。
    【解决方案2】:

    好的,不同的答案。

    假设你有你的 MyTable:

    CREATE TABLE MyTable (
        MyPrimaryKeyHnd INTEGER PRIMARY KEY,
        ...
        CreatedDate TEXT);
    

    (CreatedDate 是 ISO 格式。我想你也可以使用 Unix 时间戳。你的选择。)

    然后是可能的格式列表

    CREATE TABLE TimeFormat (
        TimeFormatHnd INTEGER PRIMARY KEY,
        TimeFormatString TEXT NOT NULL,
        TimeFormatDescriptor TEXT);
    

    您允许您的用户选择他们选择的格式并将其保存在单独的表格或 INI 文件中。 TimeformatString 将是您的strftime() 兼容格式字符串(例如'%d.%m.%Y %H:%M')。您只需要根据用户的选择来构建查询。

    【讨论】:

    • 这意味着我必须构建一些额外的 UI 来让用户选择格式。这是不必要的,用户已经在控制面板中选择了首选格式,应用程序应该尊重这个选择。我只需要使用系统日期/时间格式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2017-12-08
    • 2015-05-22
    • 2018-09-05
    相关资源
    最近更新 更多