2009-11-04 21 views
17

¿Hay alguna manera de analizar rápida y fácilmente el tiempo de Unix en C#? Soy nuevo en el idioma, así que si esta es una pregunta dolorosamente obvia, me disculpo. IE Tengo una cadena en el formato [segundos desde Época]. [Milisegundos]. ¿Existe un equivalente al SimpleDateFormat de Java en C#?Análisis del tiempo de Unix en C#

Respuesta

36

forma más sencilla es probablemente usar algo como:

private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, 
                 DateTimeKind.Utc); 

... 
public static DateTime UnixTimeToDateTime(string text) 
{ 
    double seconds = double.Parse(text, CultureInfo.InvariantCulture); 
    return Epoch.AddSeconds(seconds); 
} 

tres cosas a tener en cuenta:

  • Si sus cadenas son definitivamente de la forma "x.y" en lugar de "x, y" se debe utilizar la referencia cultural de todos como se muestra arriba, para asegurarse de que "" se analiza como un punto decimal
  • Debe especificar UTC en el constructor DateTime para asegurarse de que no crea que sea una hora local.
  • Si está utilizando .NET 3.5 o superior, es posible que desee considerar el uso de DateTimeOffset en lugar de DateTime.
1

¡Hooray para MSDN DateTime docs! También vea TimeSpan.

// First make a System.DateTime equivalent to the UNIX Epoch. 
System.DateTime dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0); 
// Add the number of seconds in UNIX timestamp to be converted. 
dateTime = dateTime.AddSeconds(numSeconds); 
// Then add the number of milliseconds 
dateTime = dateTime.Add(TimeSpan.FromMilliseconds(numMilliseconds)); 
+2

La versión editada de su publicación está bien. Sin embargo, la primera versión fue realmente inútil, ya que la página MSDN vinculada no tiene una muestra para las marcas de tiempo de UNIX, ni DateTime tiene una función incorporada que podría haber encontrado a través de esa página. Ahora que ha editado la respuesta, es lo mismo que los demás. – OregonGhost

5
// This is an example of a UNIX timestamp for the date/time 11-04-2005 09:25. 
double timestamp = 1113211532; 

// First make a System.DateTime equivalent to the UNIX Epoch. 
System.DateTime dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0); 

// Add the number of seconds in UNIX timestamp to be converted. 
dateTime = dateTime.AddSeconds(timestamp); 

// The dateTime now contains the right date/time so to format the string, 
// use the standard formatting methods of the DateTime object. 
string printDate = dateTime.ToShortDateString() +" "+ dateTime.ToShortTimeString(); 

// Print the date and time 
System.Console.WriteLine(printDate); 

surce: http://www.codeproject.com/KB/cs/timestamp.aspx

3
var date = (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)) 
       .AddSeconds(
       double.Parse(yourString, CultureInfo.InvariantCulture)); 
+3

Eso terminará con un DateTimeKind no especificado, creo. También usará la cultura local para determinar el formato del punto decimal. –

+0

Ah, cierto. Arreglará. –

1

Esto es de a blog posting by Stefan Henke:

private string conv_Timestamp2Date (int Timestamp) 
{ 
      // calculate from Unix epoch 
      System.DateTime dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0); 
      // add seconds to timestamp 
      dateTime = dateTime.AddSeconds(Timestamp); 
      string Date = dateTime.ToShortDateString() +", "+ dateTime.ToShortTimeString(); 

      return Date; 
} 
5

Esto es algo muy común que las personas en C# hacen, sin embargo, no hay una biblioteca para eso.

Creé esta mini biblioteca https://gist.github.com/1095252 para hacer mi vida (espero que la tuya también) más fácil.

+0

+1 para la biblioteca, es agradable. –

0

Aquí es como un método útil extensión

public static DateTime UnixTime(this string timestamp) 
    { 
     var dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0); 
     return dateTime.AddSeconds(int.Parse(timestamp)); 
    } 
1

Comprendo que esto es una pregunta bastante antiguo pero pensé que había puesto mi solución que utiliza Nodatime's clase instantánea que has a method specifically for this.

Instant.FromSecondsSinceUnixEpoch(longSecondsSinceEpoch).ToDateTimeUtc(); 

Entiendo totalmente que tal vez tirar en Nodatime puede ser pesado para algunas personas. Para mis proyectos donde la hinchazón de la dependencia no es una gran preocupación, prefiero confiar en las soluciones de biblioteca mantenidas en lugar de tener que mantener las mías.