2017-08-13 77 views
2

这是日期格式设置:如何从格式化的日期字符串中删除'at'?

let dateFormatter = DateFormatter() 
dateFormatter.dateStyle = .medium 
dateFormatter.timeStyle = .medium 

预期输出:

Aug 13, 2017 6:04:11 PM 

电流输出:

Aug 13, 2017 at 6:04:11 PM 

如何能在 '在' 字来非常不指定格式删除字符串,它来自哪里?

与奥地利德语语言环境:

dateFormatter.locale = Locale(identifier: "de_AT") 
13.08.2017, 18:04:11 

使用美国英语语言环境:

dateFormatter.locale = Locale(identifier: "en_US") 
Aug 13, 2017 at 6:04:11 PM 
+3

你目前的语言环境是什么?或者你也使用'dateFormat'属性? – vadian

+0

@vadian我刚刚使用语言环境信息扩展了发布。 'at'似乎来自英语的语言环境。我不使用dateFormat属性。 –

回答

-3

可以实现使用

dateFormatter.dateFormat = "MMM dd, yyyy h:mm:ss a"预期的输出。

at由于当前语言环境而放置在那里,因此如果您想要删除所有语言环境,则应指定确切的日期格式,如上所示。

+0

这会给'8月。 13,2017 6:22:48 PM'为德语语言环境,它不“看起来不错”:) –

+4

硬编码一个特定的日期和时间格式是一个糟糕的做法。对于不同地区的大多数用户来说,这会导致非常意外的日期和时间。 – rmaddy

-3

你可以写为字符串,并使用text.Replace没事来取代它。

+3

这只适用于某些地区。该字符串可以例如在德国的语言环境中是'13.08.2017,18:18:33'。 –

2

一种选择将是使两个独立的转换,一个 只有dateStyle = .medium,只有 timeStyle = .medium一个设置的设置,然后拼接的结果。但我不知道 如果

<date><space><time> 

格式在所有语言和区域设置很有意义。

一个更好的办法是使用setLocalizedDateFormatFromTemplate

dateFormatter.setLocalizedDateFormatFromTemplate("MMM dd yyyy jj:mm:ss") 

这来靠近你想要的东西,并保证给予 合理的结果对于所有区域设置。这里有一些例子。

 
en_US: Aug 13, 2017, 6:33:54 PM 
de:  13. Aug. 2017, 18:33:54 
ja:  2017年8月13日 18:33:54 

jj格式为小时的使用,这将被解释为 HH(24小时格式)或hh(12小时AM/PM格式),区域设置取决于 。

+0

看起来不错!但是我想避免指定一个格式字符串并找出'at'的来源。 –

+0

@AndrasHatvani然后请回答vadian在您的问题下面发布的问题。 – rmaddy

+0

@AndrasHatvani:“at”是语言环境的一部分。 (NS)DateFormatter最终使用“用于Unicode的ICU库”。相关部分可以是'ures_getStringByIndex(dateTimePatterns.getAlias(),glueIndex,&resStrLen,&status);'在http://source.icu-project.org/repos/icu/trunk/icu4c/source/i18n/smpdtfmt.cpp 。我不知道这个“胶水”是否可配置,但我怀疑它。 –