基本上我想要的是获得仅以小时为单位表示的时间间隔的值,而不是将其四舍五入到整小时(使用NSDateComponentsFormatter来使其正确格式化和本地化).我不知道我是否误解了NSDateComponentsFormatter.allowsFractionalUnits的使用,但我无法让格式化程序给我一个十进制值.任何人都可以帮助我发现我的错误或告诉我我以何种方式误解了这个?
从Apple docs about allowFractionalUnits属性:
当使用可用单位无法准确表示值时,可以使用小数单位.例如,如果不允许分钟,则值"1h 30m"可以格式化为"1.5h".
Swift示例代码:
let formatter = NSDateComponentsFormatter()
formatter.unitsStyle = .Abbreviated
formatter.allowedUnits = .Hour
formatter.allowsFractionalUnits = true
let onePointFiveHoursInSeconds = NSTimeInterval(1.5 * 60.0 * 60.0)
print(formatter.stringFromTimeInterval(onePointFiveHoursInSeconds)!)
//"1h" instead of expected "1.5h"
Run Code Online (Sandbox Code Playgroud)
Objective-C代码中的相同示例:
NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init];
formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleAbbreviated;
formatter.allowedUnits = NSCalendarUnitHour;
formatter.allowsFractionalUnits = YES;
NSTimeInterval onePointFiveHoursInSeconds = 1.5 * 60.0 * 60.0;
NSLog(@"%@", [formatter stringFromTimeInterval:onePointFiveHoursInSeconds]);
//"1h" instead of expected "1.5h"
Run Code Online (Sandbox Code Playgroud)
更新:我已向Apple报告了有关此问题的错误(rdar:// 22660145).
我遇到了问题,当DateComponentsFormatter
返回意外的单位数时.有人遇到过同样的问题吗?
import Foundation
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .full;
formatter.maximumUnitCount = 1;
let date = Date(timeIntervalSinceNow: -14.7 * 24 * 60 * 60)
let dateString = formatter.string(from: date, to: Date()) // 2 weeks 1 day
Run Code Online (Sandbox Code Playgroud)
我希望收到"2周",但有"2周1天".
我想打印,例如,值1.5为"1.5秒",就像Safari的时间轴一样,我正在尝试使用DateComponentsFormatter.
不幸的是,它.allowedUnits
只能归结为.second
(即使枚举有.nanosecond
).我尝试过设置.allowsFractionalUnits = true
,但我仍然得到"0秒".
有没有办法从DateComponentsFormatter中获得小数秒?
为什么是string
零?
let formatter = NSDateComponentsFormatter()
let referenceDate = NSDate(timeIntervalSinceReferenceDate: 0)
let intervalDate = NSDate(timeInterval: 3628810, sinceDate: referenceDate)
let string = formatter.stringFromDate(referenceDate, toDate: intervalDate)
Run Code Online (Sandbox Code Playgroud)
我期待返回像"6w 10s"这样的字符串.
(6周是3,628,800秒.)
要进行故障排除,我尝试设置allowedUnits
:
formatter.allowedUnits = .YearCalendarUnit | .MonthCalendarUnit | .WeekCalendarUnit | .DayCalendarUnit | .HourCalendarUnit | .MinuteCalendarUnit | .SecondCalendarUnit
Run Code Online (Sandbox Code Playgroud)
导致此错误:
"NSInvalidArgumentException","指定带间隙的位置单位是不明确的,因此不受支持"
我不知道什么是"位置单位"(在足球之外),我认为我没有指出任何差距.
我没有使用,stringFromTimeInterval()
因为根据系统的当前日期,它将返回不同的结果.(即,二月只有一个月的28/29天.)我想计算从NSDate
参考日期开始的时间间隔.
我正在使用Xcode 6.1.1(6A2008a).这是一个Playground屏幕截图,如果有帮助:
nsdate nsdateformatter nsdatecomponents swift nsdatecomponentsformatter
我正在尝试使用 aDateComponentsFormatter
将秒数格式化为时间字符串 HH:MM:SS。我总是想显示分钟和秒字段,但如果小时数为 0,我不想显示小时数。我尝试设置
formatter.zeroFormattingBehavior = .dropLeading
Run Code Online (Sandbox Code Playgroud)
但是,如果小时和分钟都是 0,这也会导致分钟数被删除。
目前,我的解决方案如下:
if timeElapsed >= 3600 {
formatter.allowedUnits = [.second, .minute, .hour]
} else {
formatter.allowedUnits = [.second, .minute]
}
formatter.zeroFormattingBehavior = .pad
Run Code Online (Sandbox Code Playgroud)
但是,我担心这个解决方案非常笨拙,如果有一些国际化不认为一小时是 3600 秒,则该解决方案将无法正常工作。有更好的解决方案吗?
localization internationalization ios swift nsdatecomponentsformatter
我在 Swift 中使用以下 DateComponentsFormatter:
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .positional
formatter.allowedUnits = [.hour, .minute, .second]
formatter.zeroFormattingBehavior = [.default]
Run Code Online (Sandbox Code Playgroud)
这会产生类似 2:41(2 分 41 秒)和 08(8 秒)的结果。但是,我想在 Minutes 位置至少保留一位数字,返回 0:08 而不是 08。这可能与 DateComponentsFormatter 一起使用吗?我更喜欢返回本地化结果的解决方案。
情况
我有一个函数,它使用DateComponentFormatter
's 函数fun string(from: Date, to: Date)
根据两个日期之间的时差返回一个格式化的字符串,它工作得很好。但是我想始终以英语返回这个格式化的字符串(当前根据设备的本地格式进行格式化)。
问题
你如何DateComponentFormatter
像你可以用DateFormatter
's做的那样设置's 本地?如果你不能,你将如何进行?
代码:
import Foundation
func returnRemainingTimeAsString(currentDate: Date, nextDate: Date)->String {
let dateComponentsFormatter = DateComponentsFormatter()
dateComponentsFormatter.unitsStyle = DateComponentsFormatter.UnitsStyle.full
dateComponentsFormatter.allowedUnits = [.day, .hour, .minute, .second]
dateComponentsFormatter.maximumUnitCount = 1
let differenceAsString = dateComponentsFormatter.string(from: currentDate, to: nextDate)!
return differenceAsString
}
let currentDate = Date()
let futureDate = currentDate.addingTimeInterval(3604)
returnRemainingTimeAsString(currentDate: currentDate, nextDate: futureDate)
// prints 1 hour (if devices local is English) or 1 hora (if …
Run Code Online (Sandbox Code Playgroud) 我正在使用DateComponentsFormatter
这样的方法:“1 小时 30 分钟”。这是我的代码:
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .short
formatter.allowedUnits = [.hour, .minute]
return formatter.string(from: 90)!
Run Code Online (Sandbox Code Playgroud)
这应该返回 1 小时 30 分钟,但我的输出是“1 分钟”。我的代码有问题还是iOS错误?
DateComponentsFormatter
因此,我在只需要格式化给定 的纳秒的情况下使用 a TimeInterval
。问题是它不能按预期工作,或者我在这里混淆了一些我不知道的东西。
这里有 3 个快速测试来说明我所说的内容。
let fooFormatter = DateComponentsFormatter()
fooFormatter.allowedUnits = [.second, .nanosecond]
fooFormatter.unitsStyle = .full
fooFormatter.collapsesLargestUnit = true
fooFormatter.allowsFractionalUnits = true
print(fooFormatter.string(from: 42.42424242424242424242424242424242))
Run Code Online (Sandbox Code Playgroud)
输出:Optional("42 seconds")
。
预期:因为这会折叠“最大单位”(在本例中为秒),所以预计会类似于(Optional("42.42424242424242424242424242424242 * 1e^9"))
。
let fooFormatter = DateComponentsFormatter()
fooFormatter.allowedUnits = [.second, .nanosecond]
fooFormatter.unitsStyle = .full
fooFormatter.allowsFractionalUnits = true
print(fooFormatter.string(from: 42.42))
Run Code Online (Sandbox Code Playgroud)
输出:Optional("42 seconds")
。
预期:即使没有选择不崩溃.second
,我的预期也接近(Optional("42 seconds 0.42 * 1e^9 nanoseconds"))
。
let fooFormatter = DateComponentsFormatter()
fooFormatter.allowedUnits = …
Run Code Online (Sandbox Code Playgroud) time nsdateformatter nsdatecomponents swift nsdatecomponentsformatter
我正在尝试将其DateComponentsFormatter
与新的 Foundation 格式化程序一起使用。要格式化日期,我可以这样做:
Date.now.formatted(.dateTime.hour().minute().second())
// 5:03:17 PM
Run Code Online (Sandbox Code Playgroud)
但是,我正在尝试使用这个新的 API 来使用DateComponentsFormatter
:
let duration: TimeInterval = 0
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .positional
formatter.allowedUnits = [.minute, .second]
formatter.zeroFormattingBehavior = [.pad]
let formattedDuration = formatter.string(from: 0)
// 00:00
Run Code Online (Sandbox Code Playgroud)
如何使用新的 Foundation 格式化程序 API 来DateComponentsFormatter
实现此目的?
duration formatter nsdatecomponents swift nsdatecomponentsformatter
我最近发现了 iOS8 的新类 NSDateComponentsFormatter,它可以让你格式化时间间隔而不是日期。凉爽的。我编写代码来执行此操作的次数超出了我的想象。所以我决定尝试在操场上使用它,但我无法让它工作。这是我的(Swift)代码:
var componentsFormatter = NSDateComponentsFormatter()
componentsFormatter.allowedUnits =
.CalendarUnitHour |
.CalendarUnitMinute |
.CalendarUnitSecond
componentsFormatter.unitsStyle = .Positional
let interval: NSTimeInterval = 345.7
let intervalstring = componentsFormatter.stringFromTimeInterval(interval)
println("Interval as String = \(intervalstring)")
Run Code Online (Sandbox Code Playgroud)
这显示
字符串形式的间隔 = nil
我尝试过各种各样的事情,但没有快乐。有人有使用这个新类的工作示例吗,或者你能发现我缺少什么吗?
(我也讲 Objective-C,所以如果你有 Objective-C 的示例代码也可以。)
使用NSDateComponentsFormatter格式化NSTimeInterval时,使用该allowedUnits
属性将结果字符串舍入到相关的时间单位通常很方便.
例如,我可能没有兴趣花时间到第二个,所以设置allowedUnits
为分钟得到一个适当舍入的输出字符串:
let duration: NSTimeInterval = 3665.0 // 1 hour, 1 minute and 5 seconds
let durationFormatter = NSDateComponentsFormatter()
durationFormatter.unitsStyle = .Full
durationFormatter.zeroFormattingBehavior = .DropAll
durationFormatter.allowedUnits = .Minute
let formattedDuration = durationFormatter.stringFromTimeInterval(duration)
Run Code Online (Sandbox Code Playgroud)
formattedDuration
将是"61分钟".
你会如何去设置allowedUnits
,以.Hour
和.Minute
这样格式化的持续时间将是"1小时1分钟"呢?
该NSDateComponentFormatter类参考并没有真正涵盖如何做到这一点.
swift ×10
ios ×6
foundation ×2
nsdate ×2
date ×1
duration ×1
formatter ×1
localization ×1
macos ×1
objective-c ×1
time ×1