gpt4 book ai didi

ios - iOS 上的 SQLite 日期函数使用系统时区,即使已设置应用程序的默认时区

转载 作者:行者123 更新时间:2023-11-30 13:18:20 24 4
gpt4 key购买 nike

我正在开发一个应用程序,用户可以在其中登录并选择可能位于不同时区的网站。因为应用程序显示与该网站相关的数据,所以我决定通过 NSTimeZone.setDefaultTimeZone 将应用程序的默认时区设置为网站时区。这非常有效,除非我通过 FMDB 从 sqlite 数据库中选择数据(我不认为 FMDB 与它有任何关系)并将 strftime 与“localtime”一起使用。虽然我们的数据使用纪元以 UTC 格式按分钟存储,但我们经常需要按本地时区的日、工作日或月显示总和。例如,要按工作日获取平均值:

select strftime('%w',datetime(epoch,'localtime')),avg(value) 
from values
where siteId = 'x'
group by 1
order by 2 desc

它使用的“本地时间”是系统本地时间,而不是应用程序的默认时区,其中所有 NSDate 调用都遵循默认时区。除了本地时间和 UTC 之外,strftime 没有任何其他时区选项,并且当前的解决方法非常慢,需要多个 SQL 往返,这应该可以在如上所述的 1 个查询中轻松处理。

谁能告诉我 iOS 上的 sqlite 如何确定“本地时间”?有没有办法强制它使用不同的默认时区?

最佳答案

正如您所见,SQLite 不使用 NSDate 或应用程序的本地时区。 datetime 函数使用修饰符进行转换。假设您有一个存储为 GMT 的数据库(我认为您的应用程序就是这种情况):

sqlite> create table mytable (id int, time datetime);
sqlite> insert into mytable values (1, CURRENT_TIMESTAMP);
sqlite> select time from mytable;
2016-06-24 19:05:36 <- THIS IS GMT
sqlite> select datetime(time, 'localtime') from mytable;
2016-06-24 15:05:36 <- THIS IS LOCAL TIME

在此示例(以及您的示例)中,“localtime”是修饰符。来自 sqlite 文档:

Modifiers

The time string can be followed by zero or more modifiers that alter date and/or time. Each modifier is a transformation that is applied to the time value to its left. Modifiers are applied from left to right; order is important. The available modifiers are as follows.

  1. NNN days
  2. NNN hours
  3. NNN minutes
  4. NNN.NNNN seconds
  5. NNN months
  6. NNN years
  7. start of month
  8. start of year
  9. start of day
  10. weekday N
  11. unixepoch
  12. localtime
  13. utc

所以不能直接转换为本地值。但是,因为您可以使用这些修饰符,您的应用程序可以从 NSDate 获取本地 GMT 偏移量:

if let myZone = NSTimeZone(abbreviation: "EST")
{
NSTimeZone.setDefaultTimeZone(myZone)
var offset = (myZone.secondsFromGMT)/3600 as Int
var offsetModifer = "\(offset) hours"
}

然后您可以像这样执行 SQLite 查询(使用 offsetModifer 构建查询,在示例中转换为 -4 小时:

sqlite> select datetime(time, '-4 hours') from mytable;
2016-06-24 15:05:36

关于ios - iOS 上的 SQLite 日期函数使用系统时区,即使已设置应用程序的默认时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38020315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com