如果我有两个变量“ 10:30”和另一个“ 1:20”,有没有办法得到它们之间的“ 2小时50分钟”的时差?我在下面尝试过
func calcTime(time1: String,time2: String) -> String {
let time12 = (String(format: "%02d", time1))
let time22 = (String(format: "%02d", time2))
let time10 = time12.prefix(2)
let time20 = time22.prefix(2)
print("hours: \(time12)")
print("minutes: \(time22)")
let time11 = time1.suffix(2)
let time21 = time2.suffix(2)
var hours = 12 - Int(time10)! + Int(time20)!
var minutes = Int(time11)! + Int(time21)!
if minutes > 60 {
hours += 1
minutes -= 60
}
let newHours = (String(format: "%02d", hours))
let newMin = (String(format: "%02d", minutes))
return "\(newHours)hrs. \(newMin)min."
}
这并不是我想要的那样。
答案 0 :(得分:2)
首先,您的数学是错误的。 10:30-> 1:20实际上是2小时50分钟。其次,您需要指定AM或PM,或使用24小时制(军用风格)时钟。最后,解决方案是使用DateFormatter
将字符串转换为Date
值,并使用这些值获取时差,然后可以将其转换为小时/分钟。
let time1 = "10:30AM"
let time2 = "1:20PM"
let formatter = DateFormatter()
formatter.dateFormat = "h:mma"
let date1 = formatter.date(from: time1)!
let date2 = formatter.date(from: time2)!
let elapsedTime = date2.timeIntervalSince(date1)
// convert from seconds to hours, rounding down to the nearest hour
let hours = floor(elapsedTime / 60 / 60)
// we have to subtract the number of seconds in hours from minutes to get
// the remaining minutes, rounding down to the nearest minute (in case you
// want to get seconds down the road)
let minutes = floor((elapsedTime - (hours * 60 * 60)) / 60)
print("\(Int(hours)) hr and \(Int(minutes)) min")
答案 1 :(得分:0)
让我们看一下您的一些代码,看看它会产生奇怪的结果:
let time12 = (String(format: "%02d", time1))
这行没有意义,格式%02d
表示要格式化的值(转换为String
表示形式)是整数,并且转换应为2位数宽且前导零。但是,您的参数time1
是一个String
值,而不是整数。
不幸的是,斯威夫特并没有向您指出这个错误,而是会咬人。由于String(format:...)
的工作方式–需要可变数量的参数–放弃了通常的Swift快速类型检查,而您得到的只是{{1}机器地址的十进制表示形式(可能是其中一部分) }}。在Playground中多次运行您的代码,您将获得不同的答案!
因此,在使用time1
时要非常小心。
目前尚不清楚您要对上述行进行什么操作,您有一个String(format:...)
值,并希望从中提取两个整数值,所以为什么要先生成一个String
({{ 1}})?
String
跳过混淆哪个变量(let time12 = String(...time1...)
,let time10 = time12.prefix(2)
let time11 = time1.suffix(2)
)包含您的time12
的情况,这里您假设字符串的格式完全相同;但是您的测试字符串之一是time1
,因此,即使这些语句引用了正确的变量,在这种情况下,您最终也会得到String
和"1:20"
。
您可以执行以下操作,将字符串分为两部分:使用"1:"
的{{1}}函数,有关详细说明,请查阅文档。在这里您可以写:
"20"
对于您的两个测试字符串,将输出:
String
现在,您应该检查每个数组(split(separator:maxSplits:omittingEmptySubsequences:)
,let time1parts = time1.split(separator: ":", omittingEmptySubsequences:false)
let time2parts = time2.split(separator: ":", omittingEmptySubsequences:false)
print("\(time1) -> \(time1parts)")
print("\(time2) -> \(time2parts)")
)是否正好包含两个元素,作为练习。
已完成操作,可以将元素转换为无符号整数(以防万一有人键入减号)。例如:
10:30 -> ["10", "30"]
1:20 -> ["1", "20"]
这将输出:
time1parts
现在,您需要检查可选的(time2parts
)值是否不是let hours1 = UInt(time1parts[0])
let minutes1 = UInt(time1parts[1])
print("\(String(describing: hours1)) | \(String(describing: minutes1))")
,并且每个值都在正确的范围内(例如,分钟数为0到59,Optional(10) | Optional(30)
类型和方法Uint?
可能会对您有所帮助)并进行数学计算。
注意:您确实有一个问题,因为您假设nil
是PM,您需要解决这个问题,您的数学永远是不正确的。也许使用24小时制(Range
)?
如果您继续前进,请提出一个新问题,以显示您已开发的代码并解释您的问题,无疑会有人帮助您。