2012-08-04 10 views
12

Sto cercando di ottenere mono (Debian 2.10.8.1-5) per funzionare correttamente sul mio raspberry pi con la distro raspbian ("Debian GNU/Linux wheezy/sid"). Ho installato mono con apt-get install mono-complete.DateTime.ToString in Mono ritorno data non valida ("00/734718/0001 01:41:38")

Tuttavia, sto riscontrando un problema interessante che non riesco a capire. Il metodo DateTime.ToString() restituisce una stringa non valida.

Qui di seguito potete trovare il mio programma di esempio con l'uscita della console:

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

uscita:

[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 

Abbastanza interessante, 734.718 sembra essere il numero di giorni trascorsi fino ad oggi dal 01/01/0001. L'ho provato con una nuova installazione su una seconda scheda ma con lo stesso problema.

Qualcuno ha un'idea di quale sia il problema e come convalidare DateTime.ToString() per restituire il valore corretto?

Aggiornamento (8/4/2012): Dopo aver scavato a lungo il codice sorgente mono, sono riuscito a risalire a System.Math.Floor. A quanto pare, restituisce sempre 0. Ho cambiato il mio programma di test ad un semplice:

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

Su Windows il risultato è "Piano (1.5): 1" considerando che il mio setup mono sul pi greco di lamponi è "Piano (1.5): 0 ". Ho visto che System.Math.Floor viene implementato come

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

Domani, io approfondire questo problema. Qualcuno sa perché questo problema potrebbe esistere?

+0

Ho calpestato anche questo problema. Hai trovato qualche soluzione? – Reniuz

+0

Forse correlato: 'DateTime.Now.ToString (" MM ")' lancia 'System.ArgumentOutOfRangeException' sul mio raspberry-pi utilizzando mono 2.10.8.1 – weberph

risposta

3

Non riesco a riprodurre il problema su Windows (non ho il lampone, ma il tuo argomento dice Mono).

ho copiato e incollato la vostra fonte esatta per Main() in un nuovo Mono console app (Mono 2.6.1), aggiunto una sola linea (Console.ReadLine();), e fatto funzionare:

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

ottengo l'uscita al di sotto :

Mono App Console App Output

+0

Grazie per aver provato su Windows. Ho appena provato su Arch Linux 3.1.9-20 per il raspberry pi e lì funziona pure. Ma non ho ancora idea del perché non funzioni sulla mia installazione debian. – piglet

+0

Solo una cronaca, la mia versione non-Arco del pi greco in esecuzione raspbian (armhf), ecco che l'output dal programma: 'mono test.exe Anno: 2012 Mese: 8 giorno: 20 DayOfWeek: Lunedi DateTime . Ora: 734735/00/0001 10:18:14 0001-00-734735' – chrispr

+0

è un bug ben noto nella versione hardfp di raspbian, sembra essere un problema più grande della semplice ricodifica di poche righe. Ma se si codificano le proprie funzioni di "stringa di formato", è comunque possibile estrarre anno, mese, data dalla classe DateTime per aggirare il problema. Non aspettatevi che toString() si formatta correttamente. – BerggreenDK

1

che è più probabile che sia un braccio mono strato binario bug. Soprattutto dal momento che si sta eseguendo una versione rilasciata prima di Raspberry Pi. Avrai molta più fortuna con quello su mono-devel mailing list. Ed è possibile che questo sia già stato risolto in git.

6

Questo è Mono bug #7938 e non riguarda solo DateTime.ToString, ma QUALSIASI funzione che, direttamente o indirettamente, passa un numero in virgola mobile a una chiamata di libreria, quando è in esecuzione su ARM con una distribuzione Linux creata per hard-float ABI. Maggiori dettagli sono disponibili nella pagina wiki C# on Raspberry Pi. Al momento non c'è una buona soluzione per questo, a meno di eseguire una distribuzione soft-float. Sto ancora sperando di poter ottenere presto un runtime mono fisso.

+0

Sono d'accordo. Il sistema operativo Soft Floating ha risolto il problema per me. 2013-05-29-wheezy-armel.zip – TravisWhidden

0

Per questo è necessario utilizzare il sistema operativo in virgola mobile. 2013-05-29-wheezy-armel.zip per esempio.

L'hard floating point non funziona bene con JITers.Ho avuto lo stesso problema, l'ho risolto installando la versione in virgola mobile del sistema operativo sul mio RP. Non avrei raccomandato l'uso di .net con un sistema operativo a virgola mobile rigido sotto la piattaforma raspberry pi. Spero che questo ti aiuti.

Problemi correlati