DateTime.Parse 有时会在 Pipes 上抛出 FormatException

DateTime.Parse sometimes throws FormatException over Pipes

我正在尝试将 DateTime 从一个进程发送到另一个进程。我的第一个想法是将 DateTime 作为字符串发送,并在收到后将字符串解析回 DateTime。不幸的是,在某些机器上,即使字符串看起来不错,我也会得到 FormatException,例如“31.10.2019 12:00:00”(无隐藏字符)。

代码是这样的,由于字符串传输正确,我将省略通信。

var datetimeAsString = SomeDateTime.ToString();      // "31.10.2019 12:00:00"
Pipe.Send(StringToBytes(datetimeAsString));
// Data gets send
var datetimeAsString = BytesToString(receivedBytes); // "31.10.2019 12:00:00"
var datetime = DateTime.Parse(datetimeAsString);

请注意它适用于某些机器。

TL;DR

尝试在不同系统之间发送 DateTime 时,NOT 使用不带参数的 ToString() 将其转换为字符串,而使用 DateTime.ToBinary and DateTime.FromBinary 或者如果您需要字符串指定一种文化,例如

var datetimeAsString = thisDate.ToString(new CultureInfo("en-us"));
DateTime.Parse(datetimeAsString, new CultureInfo("en-us"));

PS:我认为这不仅适用于你想要交换数据的情况,也适用于其他情况,因此应该被视为一般性建议。

--

问题是发送 DateTime 的软件将 DateTime.ToString() 转换为德语格式,即使该软件是英文的。接收软件有时是德语,有时是英语。德语软件可以在德语字符串上使用 DateTime.Parse,其他系统不能。

解决方案是不将 DateTime 转换为字符串,而是使用 DateTime.ToBinary 方法将其转换为 long。我认为用 CultureInfo.InvariantCulture 也可以解决它,但我们认为 long 更干净。