标签: nsdatecomponentsformatter

我在NSDateComponentsFormatter上使用allowFractionalUnits做错了什么?

基本上我想要的是获得仅以小时为单位表示的时间间隔的值,而不是将其四舍五入到整小时(使用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).

objective-c foundation ios swift nsdatecomponentsformatter

31
推荐指数
2
解决办法
786
查看次数

DateComponentsFormatter返回错误的单位数

我遇到了问题,当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天".

ios nsdatecomponentsformatter

12
推荐指数
1
解决办法
1257
查看次数

DateComponentsFormatter可以格式化小数秒吗?

我想打印,例如,值1.5为"1.5秒",就像Safari的时间轴一样,我正在尝试使用DateComponentsFormatter.

不幸的是,它.allowedUnits只能归结为.second(即使枚举有.nanosecond).我尝试过设置.allowsFractionalUnits = true,但我仍然得到"0秒".

有没有办法从DateComponentsFormatter中获得小数秒?

macos foundation nsdatecomponents nsdatecomponentsformatter

12
推荐指数
1
解决办法
270
查看次数

NSDateComponentsFormatter的stringFromDate(_,toDate :)返回nil

为什么是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

6
推荐指数
1
解决办法
1728
查看次数

DateComponentsFormatter 减少零小时但不减少零分钟

我正在尝试使用 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

6
推荐指数
0
解决办法
780
查看次数

Swift DateComponentsFormatter 删除前导零但在分钟位置至少保留一位

我在 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 一起使用吗?我更喜欢返回本地化结果的解决方案。

date nsdatecomponents ios swift nsdatecomponentsformatter

5
推荐指数
1
解决办法
2306
查看次数

如何设置 DateComponentFormatter 的本地而不是当前?

情况

我有一个函数,它使用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)

nsdate swift nsdatecomponentsformatter

4
推荐指数
1
解决办法
2398
查看次数

DateComponentsFormatter - 只显示被描述为分钟的小时 - 错误?

我正在使用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错误?

ios swift nsdatecomponentsformatter

3
推荐指数
1
解决办法
844
查看次数

DateComponentsFormatter 和 .nanosecond

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

3
推荐指数
1
解决办法
907
查看次数

如何使用新的 Foundation 格式化方法来格式化时间间隔?

我正在尝试将其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

2
推荐指数
1
解决办法
3012
查看次数

我对 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 的示例代码也可以。)

swift nsdatecomponentsformatter

1
推荐指数
1
解决办法
1698
查看次数

在Swift中为NSDateComponenstFormatter设置多个allowedUnits

背景:

使用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类参考并没有真正涵盖如何做到这一点.

ios swift nsdatecomponentsformatter

1
推荐指数
1
解决办法
899
查看次数