pig*_*let 12 mono datetime raspberry-pi
我试图使用raspbian发行版("Debian GNU/Linux wheezy/sid")获得单声道(Debian 2.10.8.1-5)在我的覆盆子pi上正常运行.我用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"));
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
有趣的是,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));
}
Run Code Online (Sandbox Code Playgroud)
在Windows上,结果是"Floor(1.5):1"而在我的树莓pi上的单声道设置是"Floor(1.5):0".我已经看到System.Math.Floor实现为
[MethodImplAttribute (MethodImplOptions.InternalCall)]
public extern static double Floor (double d);
Run Code Online (Sandbox Code Playgroud)
明天,我会进一步研究这个问题.有谁知道为什么这个问题可能存在?
这是Mono bug #7938,它不仅影响DateTime.ToString,而且还影响任何直接或间接将浮点数传递给库调用的函数,当在ARM上运行时,为硬盘构建一个Linux发行版ABI.有关更多详细信息,请参阅Raspberry Pi wiki页面上的C#.目前还没有很好的解决方案,没有运行软浮动发行版.我仍然希望我们能尽快获得固定的单声道运行时间.
我无法在 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到以下输出: