2012-08-04 6 views
12

Próbuję uzyskać mono (Debian 2.10.8.1-5), aby działał poprawnie na moim raspberry pi z dystrybucją raspbian ("Debian GNU/Linux wheezy/sid"). Zainstalowałem mono z apt-get install mono-complete.DateTime.ToString w Mono zwraca niepoprawną datę ("00/734718/0001 01:41:38")

Jednak mam ciekawy problem, którego nie mogę zrozumieć. Metoda DateTime.ToString() zwraca niepoprawny ciąg.

Poniżej można znaleźć przykładowy program z wyjściem konsoli:

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")); 
     } 
    } 
} 

wyjściowa:

[email protected] ~/bin $ mono MonoTest.exe 
Year: 2012 
Month: 8 
Day: 3 
DayOfWeek: Friday 
DateTime.Now: 00/734718/0001 01:41:38 
0001-00-734718 

Co ciekawe, 734718 wydaje się być liczba dni, które upłynęły do ​​dziś od 01/01/0001. Spróbowałem go ze świeżą instalacją na drugiej planszy, ale z tym samym problemem.

Czy ktoś ma pomysł, jaki jest tutaj problem i jak przekonać DateTime.ToString(), aby zwrócić właściwą wartość?

Aktualizacja (8/4/2012): Po długim wykopaniu kodu źródłowego mono udało mi się prześledzić problem z powrotem do System.Math.Floor. Wydaje się, że zawsze zwraca 0. zmieniłem program testowy na prostą:

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

W Windows wynik jest „Piętro (1.5): 1” Zważywszy na mojej konfiguracji mono na pi malinowym to „Piętro (1,5): 0 ". Widziałem, że System.Math.Floor jest zaimplementowany jako

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

Jutro będę szukać dalej w tej kwestii. Czy ktoś wie, dlaczego ten problem mógł istnieć?

+0

Podszedłem również do tego problemu. Czy znalazłeś jakieś rozwiązanie? – Reniuz

+0

Może być powiązany: 'DateTime.Now.ToString (" MM ")' wyrzuca 'System.ArgumentOutOfRangeException' na moim raspberry-pi używając mono 2.10.8.1 – weberph

Odpowiedz

3

Nie mogę odtworzyć Twojego problemu w systemie Windows (nie mam maliny, ale Twój temat mówi: Mono).

I skopiowana i wklejona dokładną źródło dla Main() do nowej aplikacji konsoli Mono (Mono 2.6.1), dodaje jedną linię (Console.ReadLine();), a prowadził go:

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(); 
    } 
    } 
} 

otrzymuję poniższy wyjście :

Mono App Console App Output

+0

Dziękujemy za wypróbowanie go w systemie Windows. Po prostu wypróbowałem to na Arch Linux 3.1.9-20 dla raspberry pi i tam też to działa. Ale wciąż nie mam pojęcia, dlaczego nie działa na mojej instalacji debian. – piglet

+0

Po prostu FYI, na mojej wersji non-Arch PI działa raspbian (armhf), oto ouput z programu: 'mono test.exe Rok: 2012 Miesiąc: 8 Dzień: 20 DzienTygodnia: Poniedziałek DateTime .Teraz: 734735/00/0001 10:18:14 0001-00-734735' – chrispr

+0

jego dobrze znany błąd w wersji hardfp raspbian, wydaje się być większym problemem niż tylko przekodowanie kilku linii. Ale jeśli zakodujesz własne funkcje "ciągu znaków", nadal możesz przeciągać rok, miesiąc, datę z klasy DateTime, aby ominąć to. Po prostu nie oczekuj, że toString() poprawnie sformatuje. – BerggreenDK

1

to najprawdopodobniej ARM Mono warstwa binarnego bug. Zwłaszcza, że ​​używasz wersji, która została wydana przed Raspberry Pi. Będziesz miał dużo lepsze szczęście z tym na mono-devel mailing list. I możliwe, że już to naprawiono.

6

To Mono bug #7938 i nie wpływa tylko DateTime.ToString, ale każda funkcja, która bezpośrednio lub pośrednio, przekazuje liczbę zmiennoprzecinkową do wywołania biblioteki, kiedy działa na ARM z dystrybucji Linux zbudowany dla ciężko płynący ABI. Więcej szczegółów można znaleźć na stronie wiki C# on Raspberry Pi. Obecnie nie ma na to dobrego rozwiązania, poza uruchomieniem dystrybucji typu "soft-float". Nadal mam nadzieję, że niedługo otrzymamy stały mono.

+0

Zgadzam się. Soft Floating OS naprawił problem dla mnie. 2013-05-29-wheezy-armel.zip – TravisWhidden

0

Do tego celu należy użyć systemu operacyjnego Soft Floating Point. 2013-05-29-wheezy-armel.zip na przykład.

Twardy zmiennoprzecinkowy nie działa dobrze z JITers.Miałem ten sam problem, rozwiązałem go, instalując soft-zmienną wersję systemu operacyjnego na moim RP. Nie polecałbym używania .net z twardym, zmiennoprzecinkowym systemem operacyjnym pod platformą raspberry pi. Mam nadzieję że to pomoże.