如何将基于小数的时间转换为NSDate?

时间:2015-05-07 15:58:27

标签: objective-c swift datetime nsdate date-arithmetic

我有时间表示为双打。例如:

8:00am is 8.00
1:30pm is 13.50
6:15pm is 18.25
11:20pm is 23.333

如何将双打转换为今天的NSDate?

3 个答案:

答案 0 :(得分:2)

let input = 13.50

let hour = Int(input)
let minute = Int((input - Double(Int(input))) * 60)

let resultDate = NSCalendar.currentCalendar().dateBySettingHour(hour, minute: minute, second: 0, ofDate: NSDate(), options: nil)!

答案 1 :(得分:1)

使用此答案今天午夜:How can I get an NSDate object for today at midnight?

NSDate *date = [NSDate date];
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
NSUInteger preservedComponents = (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit);
date = [calendar dateFromComponents:[calendar components:preservedComponents fromDate:date]];

然后,一旦你有午夜时间,我们将使用addTimeInterval来添加十进制值的秒数。

int hoursToAdd = (int)timeDecimal;
int minutesToAdd = timeDecimal - hoursToAdd; 
int secondsFromHours = hoursToAdd*60*60;
int secondsFromMinutes = minutesToAdd*60;
int totalSeconds = secondsFromHours + secondsFromMinutes;
NSDate *newDate = [date addTimeInterval:totalSeconds];

应该做的伎俩!

答案 2 :(得分:1)

从今天午夜开始,加上你的小时数:

func dateFromDecimalHours(hours: Double) -> NSDate {
    let midnight = NSCalendar.currentCalendar().startOfDayForDate(NSDate())
    let date = midnight.dateByAddingTimeInterval(round(hours * 3600.0))
    return date
}

(大多数小数部分并不完全由Double表示, 这就是时间间隔四舍五入到秒的原因。)

示例/测试用例:

let fmt = NSDateFormatter()
fmt.dateFormat = "dd/MM/yyyy hh:mm.ss a"

let d1 = dateFromDecimalHours(18.25)
println(fmt.stringFromDate(d1))    // 07/05/2015 06:15.00 pm

let d2 = dateFromDecimalHours(23.3333)
println(fmt.stringFromDate(d2))    // 07/05/2015 11:20.00 pm

let d3 = dateFromDecimalHours(1.0 + 23.0/60.0 + 45.0/3600.0)
println(fmt.stringFromDate(d3))    // 07/05/2015 01:23.45 am