能否将 24 小时时间字符串格式化为包含 AM/PM 的 12 小时时间字符串?

问题描述 投票:0回答:7

我在 sqlite 中以 %H:%M 字符串格式存储一些时间值(例如“15:43”),但我想将它们格式化为带有 AM/PM 指示器的 12 小时格式(例如“3:下午 43 点”)。这可以用 sqlite 实现吗(如果可以,如何实现),还是我需要在我的应用程序代码中执行此操作?

sqlite
7个回答
4
投票

除非您使用自己的自定义函数扩展sqlite,否则您必须通过代码来完成此操作。

sqlite 的 strftime 日期格式化函数仅支持其 C 对应函数的一小部分,不足以解决您的问题。 sqlite 还缺少像 IF 或 CASE 这样的选择结构,使得简单的 if/else 变得不可能。


4
投票

一些伪代码可以帮助您:

if (hourpart of time >= 12)
    subtract 12 from hours
    append string " pm"
else // hourpart < 12
    append string " am"
end if

在 SQL 中,您可以使用 CASE 语法来完成此操作。


仔细查看问题后:

SELECT (CASE HOUR(myTimeColumn) >= 12 WHEN 1 THEN
         ((HOUR(myTimeColumn) - 12) + '-' + MINUTE(myTimeColumn) + ' pm')
       ELSE
         (HOUR(myTimeColumn) + '-' + MINUTE(myTimeColumn) + ' am')
       AS AmPmTime,
       someOtherColumn
FROM myTable

我不完全确定所有这些都是有效的 SQLite 语法,但您应该能够纠正这些错误。


2
投票

这里介绍了一些特殊情况。我使用“now”作为来源,但您可以根据您的字符串调整它:

select
  CASE 
  --For 00:05, for example.
  WHEN (strftime('%H', 'now', 'localtime') - 12) = -12
  THEN  '12:' || strftime('%M', 'now', 'localtime') ||' '|| 'AM'
  --For 12:05, for example.
  WHEN (strftime('%H', 'now', 'localtime') - 12) = 0
  THEN '12:' || strftime('%M', 'now', 'localtime') ||' '|| 'PM'
  --other am time
  WHEN (strftime('%H', 'now', 'localtime') - 12) < 0
  THEN  strftime('%H', 'now', 'localtime') ||':'||
    strftime('%M', 'now', 'localtime') ||' '|| 'AM'
  ELSE
  --other pm time
    (cast(strftime('%H', 'now', 'localtime') as integer) - 12) ||':'||
    strftime('%M', 'now', 'localtime') ||' '|| 'PM'
  END here_you_go_usa;

1
投票

在您的应用程序中执行此操作。以正常的 24 小时格式将其存储在数据库中。在数据库中,它可以存储为日期条目而不是字符串(如果我错了,请纠正我)


0
投票

正如 PoweRoy 所推荐的,这属于应用程序。

建议在通信中存储或使用的任何类型的数据都使用标准的、区域设置不敏感的格式:http://www.mihai-nita.net/article.php?artID=20051025a


0
投票

这是一个工作的..感谢托马斯

SELECT 
    PatientName, 
    CASE WHEN 
        StrFTime('%H', AppointmentTime) % 12 = 0 THEN 12
        ELSE StrFTime('%H', AppointmentTime) % 12 END 
    || ':' ||
        StrFTime('%M', AppointmentTime)
    || ' ' ||
    CASE WHEN
        StrFTime('%H', AppointmentTime) > 12 THEN 'PM'
        ELSE 'AM' END   
    `APP_TIME`
From Patients;      

输出
阿卜杜勒·萨利姆,中午 12:05


0
投票

Abdul Salim 的答案只返回 PM,因为最后一个 CASE WHEN 末尾的一个小错误,找到了任何一个值。

SELECT username, sqlaction, change_date, CASE WHEN StrFTime('%H', change_date) % 12 = 0 THEN 12 ELSE StrFTime('%H', change_date) % 12 END || ':' || StrFTime('%M', change_date) || ' ' || CASE WHEN StrFTime('%H', change_date)-0 >= 12 THEN 'PM' ELSE 'AM' END as Time From logs;
输出:

用户名sqlaction更改日期时间tcoto更新2023-09-15 11:37:2111:37 上午小跑更新2023-09-15 11:57:5711:57 上午tcoto插入2023-09-18 11:24:5911:24 上午tcoto插入2023-09-18 11:25:0511:25 上午tcoto更新2023-09-18 16:34:514:34 下午托托更新2023-09-18 16:43:564:43 下午tcoto更新2023-09-18 16:45:504:45 下午tcoto更新2023-09-18 17:17:225:17 下午
© www.soinside.com 2019 - 2024. All rights reserved.