【发布时间】:2021-08-19 16:02:30
【问题描述】:
我有以下功能,这是在一些人的帮助下制作的:
module DateTimeFormatter =
let mutable year = -1
let mutable month = -1
let mutable day = -1
let mutable hour = -1
let mutable minute = -1
let mutable second = -1
let dateTimeArray = "xxxx-xx-xx xx:xx:xx.xxx".ToCharArray()
let timeArray = "xx:xx:xx.xxx".ToCharArray()
let zeroChar = int '0'
// format the datetime into a date and a time with milliseconds
let format (dateTime: DateTime) =
if dateTime.Year <> year then
year <- dateTime.Year
dateTimeArray.[0] <- char (zeroChar + year / 1000)
dateTimeArray.[1] <- char (zeroChar + (year % 1000) / 100)
dateTimeArray.[2] <- char (zeroChar + (year % 100) / 10)
dateTimeArray.[3] <- char (zeroChar + (year % 10))
if dateTime.Month <> month then
month <- dateTime.Month
dateTimeArray.[5] <- char (zeroChar + month / 10)
dateTimeArray.[6] <- char (zeroChar + month % 10)
if dateTime.Day <> day then
day <- dateTime.Day
dateTimeArray.[8] <- char (zeroChar + day / 10)
dateTimeArray.[9] <- char (zeroChar + day % 10)
if dateTime.Hour <> hour then
hour <- dateTime.Hour
dateTimeArray.[11] <- char (zeroChar + hour / 10)
dateTimeArray.[12] <- char (zeroChar + hour % 10)
if dateTime.Minute <> minute then
minute <- dateTime.Minute
dateTimeArray.[14] <- char (zeroChar + minute / 10)
dateTimeArray.[15] <- char (zeroChar + minute % 10)
if dateTime.Second <> second then
second <- dateTime.Second
dateTimeArray.[17] <- char (zeroChar + second / 10)
dateTimeArray.[18] <- char (zeroChar + second % 10)
let ms = dateTime.Millisecond
dateTimeArray.[20] <- char (zeroChar + ms / 100)
dateTimeArray.[21] <- char (zeroChar + (ms % 100) / 10)
dateTimeArray.[22] <- char (zeroChar + ms % 10)
new string(dateTimeArray)
这个想法是尽可能快地构建日期时间 + 毫秒时间戳。
但有时,但并非总是如此,我会得到以下输出:
2021-06-01 xx:xx:53.648
而且失败总是在小时/分钟,但有时它工作正常,有时却不行。并且在构建字符串时我没有看到测试有任何问题,但看起来小时和分钟即使是第一次测试也失败了,因为有占位符“x”。
这可能是这些超级简单的事情之一,需要另一双眼睛才能看到它:)
【问题讨论】:
-
你是否有机会同时运行多次?
-
是的,它用于一堆异步/并行调用;我想可以想象一个调用通过了相等性测试,而另一个调用只是设置了值并且还没有设置字符,但是问题会发生一次,然后字符会在那之后设置
-
@Thomas 为每个线程创建格式化程序。否则即使你没有观察到'xx',你也会得到不可预知的结果。例如。小时可能会被刚刚开始格式化的线程修改,它会影响同时创建新字符串的线程。
-
C# 中没有编译器机制来请求每个线程的字段吗?我想知道是否有 F# 等价物。我认为有一些属性
-
好吧,如果您声称它是间歇性发生的,而不仅仅是在前几次通过时,那么恐怕我们需要重新制作。
标签: f#