2012-08-04 12 views
12

Estoy intentando que mono (Debian 2.10.8.1-5) funcione correctamente en mi raspberry pi con la distribución raspbian ("Debian GNU/Linux wheezy/sid"). He instalado mono con apt-get install mono-complete.DateTime.ToString in Mono return fecha no válida ("00/734718/0001 01:41:38")

Sin embargo, me encuentro con un problema interesante que no puedo entender. El método DateTime.ToString() devuelve una cadena no válida.

A continuación puede encontrar mi programa muestra con la salida de la consola:

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

Salida:

[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 

Curiosamente, 734.718 parece ser el número de días transcurridos hasta hoy desde 01/01/0001. Lo he probado con una instalación nueva en una segunda placa pero con el mismo problema.

¿Alguien tiene una idea de cuál es el problema aquí y cómo convencer a DateTime.ToString() para que devuelva el valor correcto?

Actualización (8/4/2012): Después de un largo recorrido por el código fuente mono pude localizar el problema en System.Math.Floor. Al parecer, siempre devuelve 0. he cambiado de programa de prueba para un simple:

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

En Windows el resultado es "Suelo (1.5): 1" Mientras que en mi configuración mono en el pi frambuesa es "Suelo (1.5): 0 ". He visto que System.Math.Floor se implementa como

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

Mañana, voy a profundizar en este tema. ¿Alguien sabe por qué podría existir este problema?

+0

También entré en este problema. ¿Has encontrado alguna solución? – Reniuz

+0

Quizás relacionado: 'DateTime.Now.ToString (" MM ")' arroja 'System.ArgumentOutOfRangeException' en mi raspberry-pi usando mono 2.10.8.1 – weberph

Respuesta

3

No puedo reproducir su problema en Windows (no tiene frambuesa, pero su tema dice Mono).

He copiado y pegado su fuente exacta para Main() en una nueva aplicación de consola Mono (Mono 2.6.1), añadí una sola línea (Console.ReadLine();), y la pasó:

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

Me da la salida por debajo :

Mono App Console App Output

+0

Gracias por probarlo en Windows. Acabo de probarlo en Arch Linux 3.1.9-20 para el Raspberry pi y allí funciona también. Pero todavía no tengo idea de por qué no funciona en mi instalación de Debian. – piglet

+0

Como digo, en mi versión no-Arco de la PI corriendo raspbian (armhf), aquí es que la salida de su programa: 'mono test.exe Año: 2012 Mes: 8 Día: 20 DayOfWeek: Lunes DateTime .Now: 734735/00/0001 10:18:14 0001-00-734735' – chrispr

+0

es un error bien conocido en la versión hardfp de raspbian, parece ser un problema más grave que simplemente recodificar unas pocas líneas. Pero si codifica sus propias funciones de "cadena de formato", aún puede extraer año, mes, fecha de la clase DateTime para evitarlo. No espere que toString() se formatee correctamente. – BerggreenDK

1

que es más probable que sea un ARM Mono fallo capa binario. Especialmente porque está ejecutando una versión que fue lanzada antes de Raspberry Pi. Tendrás mucha mejor suerte con eso en mono-devel mailing list. Y es posible que esto ya esté arreglado en git.

6

Este es el error Mono #7938, y afecta no solo a DateTime.ToString, sino a CUALQUIER función que, directa o indirectamente, transmita un número de coma flotante a una llamada de biblioteca, cuando se ejecuta en ARM con una distribución Linux construida para hard-float ABI. Más detalles están disponibles en la página wiki C# on Raspberry Pi. Actualmente no hay una buena solución para esto, salvo ejecutar una distribución de flotación blanda. Todavía espero que podamos obtener un tiempo de ejecución mono fijo pronto.

+0

Estoy de acuerdo. El sistema operativo Soft Floating solucionó el problema. 2013-05-29-wheezy-armel.zip – TravisWhidden

0

Debe utilizar el sistema operativo de punto flotante suave para esto. 2013-05-29-wheezy-armel.zip por ejemplo.

El punto flotante duro no funciona bien con JITers.Tuve el mismo problema, lo resolví instalando la versión de coma flotante del SO en mi RP. No recomendaría usar .net con un sistema operativo de punto flotante duro bajo la plataforma frambuesa pi. Espero que esto ayude.