Mono中的DateTime.ToString返回无效日期(“00/734718/0001 01:41:38”)

时间:2012-08-04 03:40:35

标签: datetime mono raspberry-pi

我正在尝试使用raspbian发行版(“Debian GNU / Linux wheezy / sid”)在我的覆盆子pi上正常运行单声道(Debian 2.10.8.1-5)。我用apt-get install mono-complete安装了mono。

然而,我遇到了一个我无法弄清楚的有趣问题。 DateTime.ToString()方法返回无效字符串。

下面你可以通过控制台输出找到我的示例程序:

using System;

namespace MonoTest
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime now = DateTime.Now;
            Console.WriteLine("Year: " + now.Year);
            Console.WriteLine("Month: " + now.Month);
            Console.WriteLine("Day: " + now.Day);
            Console.WriteLine("DayOfWeek: " + now.DayOfWeek);
            Console.WriteLine("DateTime.Now: " + DateTime.Now);
            Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd"));
        }
    }
}

输出:

pi@raspberrypi ~/bin $ mono MonoTest.exe
Year: 2012
Month: 8
Day: 3
DayOfWeek: Friday
DateTime.Now: 00/734718/0001 01:41:38
0001-00-734718

有趣的是,734718似乎是自01/01/0001以来直到今天的天数。我已尝试在第二块板上进行全新安装,但遇到同样的问题。

有没有人知道这里的问题是什么以及如何说服DateTime.ToString()返回正确的值?

更新(2012年8月4日):经过长时间挖掘单声道源代码后,我能够将问题追溯回System.Math.Floor。显然,它总是返回0.我将测试程序改为简单:

static void Main(string[] args)
{
    Console.WriteLine("Floor(1.5): " + System.Math.Floor(1.5));
}

在Windows上,结果是“Floor(1.5):1”而在我的树莓派上的单声道设置是“Floor(1.5):0”。我已经看到System.Math.Floor实现为

[MethodImplAttribute (MethodImplOptions.InternalCall)]
public extern static double Floor (double d);

明天,我会进一步研究这个问题。有谁知道为什么这个问题可能存在?

4 个答案:

答案 0 :(得分:6)

这是Mono bug #7938,它不仅影响DateTime.ToString,而且还影响在使用Linux发行版的ARM上运行时直接或间接将浮点数传递给库调用的任何函数为硬浮ABI而建。有关详细信息,请访问C# on Raspberry Pi维基页面。目前还没有很好的解决方案,没有运行软浮动发行版。我仍然希望我们能尽快获得固定的单声道运行时间。

答案 1 :(得分:3)

我无法在Windows上重现您的问题(没有树莓,但您的主题是Mono)。

我将Main()的确切来源复制并粘贴到新的Mono控制台应用程序(Mono 2.6.1)中,添加了一行(Console.ReadLine();)并运行它:

using System;

namespace TestDateTimeNow
{

  class MainClass
  {
    public static void Main (string[] args)
    {
        DateTime now = DateTime.Now;
        Console.WriteLine("Year: " + now.Year);
        Console.WriteLine("Month: " + now.Month);
        Console.WriteLine("Day: " + now.Day);
        Console.WriteLine("DayOfWeek: " + now.DayOfWeek);
        Console.WriteLine("DateTime.Now: " + DateTime.Now);
        Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd"));
        Console.ReadLine();
    }
  }
}

我得到以下输出:

Mono App Console App Output

答案 2 :(得分:1)

最有可能是ARM Mono二进制层错误。特别是因为你正在运行一个在Raspberry Pi之前发布的版本。 mono-devel mailing list上你会有更好的运气。而且这可能已经在git中修复了。

答案 3 :(得分:0)

您需要使用软浮点操作系统。 2013-05-29-wheezy-armel.zip例如。

硬浮点与JITers不兼容。我有同样的问题,通过在我的RP上安装操作系统的软浮点版本来解决它。我不建议在raspberry pi平台下使用.net和硬浮点操作系统。希望这会有所帮助。