Math 将秒转换为天、小时、分钟和秒

Math 将秒转换为天、小时、分钟和秒,math,f#,Math,F#,我正在尝试使用F#将特定的秒值转换为以下格式: 00d 00h 00m 00s 我确信我的计算是正确的,但它也给了我错误的时间。我的代码如下: let sum = 266521 let day = sum / 86400 let leftover = sum % 86400 let hour = leftover / 3600 leftover = leftover % 3600 let minute = leftover / 60 leftover = leftover % 60 我试

我正在尝试使用F#将特定的秒值转换为以下格式:

00d 00h 00m 00s

我确信我的计算是正确的,但它也给了我错误的时间。我的代码如下:

let sum = 266521
let day = sum / 86400
let leftover = sum % 86400

let hour = leftover / 3600
leftover = leftover % 3600

let minute = leftover / 60
leftover = leftover % 60

我试图进行贪婪计算,但它给出了以下值: 3d 2h 122m 7321s

但不可能是122米,应该在一小时内。我不明白我的错误在哪里。 你能帮助我吗?
提前感谢

这是因为F#中的值是不可变的(不能更改)。您的值“leftover”保持在其第一个值7321。这样做有助于线程和数据共享。在更改“剩余”的值时创建新值,或者以其他方式使该值可变:

let mutable leftover = sum % 86400
leftover <- leftover % 3600
让可变剩余=总和%86400
剩下的线

leftover = leftover % 3600
是一个布尔表达式,用于将
剩余部分
剩余部分%3600
进行比较(其计算结果可能为false)。你需要做的是分配一个新值

let leftover' = leftover % 3600

然后随后使用
leftover'

如何利用内置功能

> open System;;
> let secs = 266521;;

val secs : int = 266521

> let s = (TimeSpan.FromSeconds (float secs)).ToString "d\d\ hh\h\ mm\m\ ss\s";;

val s : string = "3d 02h 02m 01s"

请注意编译器警告。有问题的行生成
此表达式的类型应为“unit”,但类型为“bool”。使用“ignore”放弃表达式的结果,或使用“let”将结果绑定到名称。
True,但在具体示例中指出F#编码的细微之处是值得的。
> open System;;
> let secs = 266521;;

val secs : int = 266521

> let s = (TimeSpan.FromSeconds (float secs)).ToString "d\d\ hh\h\ mm\m\ ss\s";;

val s : string = "3d 02h 02m 01s"