Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Date&;中正确支持iOS 12小时/24小时时间覆盖;日期格式化程序的时间设置?_Ios_Swift_Locale_Regional Settings_Dateformatter - Fatal编程技术网

如何在Date&;中正确支持iOS 12小时/24小时时间覆盖;日期格式化程序的时间设置?

如何在Date&;中正确支持iOS 12小时/24小时时间覆盖;日期格式化程序的时间设置?,ios,swift,locale,regional-settings,dateformatter,Ios,Swift,Locale,Regional Settings,Dateformatter,如果您的iOS设备设置为使用默认为12小时时间的区域(例如美国),并且您的日期格式化程序设置如下: var dateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "h:mm a" return formatter }() 然后,如果在iOS设置的日期和时间中打开“24小时时间”开关,它将以24小时格式输出时间 如果您的自定义日期格式为“H:mm”,

如果您的iOS设备设置为使用默认为12小时时间的区域(例如美国),并且您的
日期格式化程序设置如下:

var dateFormatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "h:mm a"

    return formatter
}()
然后,如果在iOS设置的日期和时间中打开“24小时时间”开关,它将以24小时格式输出时间

如果您的自定义日期格式为“H:mm”,即24小时,并且您仍然处于默认的12小时区域,则无论24小时开关的开/关状态如何,它都将输出24小时时间

好的,很好,很简单,我将使用“h:mm a”,然后用户将看到根据他们喜欢的格式显示的任何时间但是如果您将您的区域更改为默认使用24小时时间的区域,则行为会发生逆转!如果您有“H:mm”,并且24小时时间开关关闭,则会将其更改为12小时时间(“H:mm a”)

是的,您通常可以通过使用时间样式(
formatter.timeStyle=.short
)而不是使用自定义日期格式来避免这种情况,但是如果您需要自定义日期格式并且希望尊重用户的设置,您应该怎么做?(例如,如果您需要在字符串中插入一些自定义字符,或者只是希望组件按非标准顺序排列)

我想在这里吃蛋糕的唯一方法是提前检查用户的偏好(据我所知,这是您的偏好),或者可能是语言环境的默认设置(我不知道),然后相应地调整格式

我更清楚地演示了这个问题(显然,它必须在设备上运行,因为模拟器上没有24小时开关)

我知道有各种各样的解决办法,但我不明白如果你正在制作一个应用程序,它使用自定义的日期/时间格式作为你的用户界面,并且有来自世界不同地区的用户,苹果希望你做什么?我是否遗漏了什么,或者这是iOS中的一个缺陷

注意:这个问题是关于将日期转换为字符串以显示的,所以我希望尽可能尊重用户的区域设置和其他设置。我知道您可以将locale设置为en_POSIX等,但这并不能解决问题。我还希望尽可能无缝地实现这一点,并充分利用内置的功能,但这在这里似乎是不可能的,除非您仅针对具有相同默认24小时时间设置的区域中的用户…

来自:

只能在使用固定格式时设置此属性 表示,如使用固定格式日期中所述 陈述。对于用户可见的表示,应使用 dateStyle和timeStyle属性,或 如果需要格式,请设置LocalizedDataFormatFromTemplate(:)方法 无法使用预定义的样式实现;这两个 属性和此方法提供本地化的日期表示形式 适合向用户显示

我仍然不明白为什么基金会讨厌修改日期格式,如果您在日期格式化程序中没有使用固定的区域设置,但似乎文档不建议使用非固定格式表示的自定义日期格式。

setLocalizedDateFormatFromTemplate
似乎是您所需要的,如果您不能仅仅依赖于
dateStyle
timeStyle
,尽管它似乎不会随着用户的24小时时间设置自动更改,因此可以在指定模板之前检查24小时时间是否已打开

该方法应该允许您指定格式,而不会丢失特定于每个区域设置的格式

编辑苹果开发者关系部的回复(想法相同,但更详细):

正确的处理方法是避免指定“hh”或“hh” 基于区域设置,而是在中使用“jj”骨架符号 与
-[NSDateFormatter setLocalizedDataFormatFromTemplate:][code>结合使用

从日期字段符号表的“小时”部分 ():

在这样的上下文中输入骨架符号,它会请求 区域设置的首选小时格式(h、h、K或K),由 补充数据中小时数元素的首选属性

通过使用“jj”,您可以获得最符合用户需求的格式 当前设置:

NSDateFormatter *formatter = [NSDateFormatter new];
[formatter setLocalizedDateFormatFromTemplate:@"jj:mm"];
NSLog(@"%@: 'jj:mm' => '%@' ('%@')", formatter.locale.localeIdentifier, formatter.dateFormat, [formatter stringFromDate:[NSDate date]]);
导致

  • en_US(12小时):“en_US:'jj:mm'=>'h:mm a'('1:44 PM')
  • en_-US(24小时):“en_-US:'jj:mm'=>'HH:mm'('13:44')
  • 英国广播公司(12小时):“英国广播公司:'jj:mm'=>'h:mma'('1:44 pm')
  • en_GB(24小时):“en_GB:'jj:mm'=>'HH:mm'('13:44')
这使您可以匹配首选格式,同时保持 用户的首选时间设置


决不能使用固定日期格式向用户显示日期/时间。您应该使用DateFormatter dateStyle和timeStyle。正如我在问题中所说,不能总是使用
dateStyle
timeStyle
。请查看上面的链接。您应该只将时间或日期样式设置为短、中、长或全,它将根据用户区域设置和设备设置显示,正如我所说,我已经知道时间样式。正如我在问题中已经指出的,这并不总是一种选择。