2010-04-01 19 views
11

Trabajo en una industria extraña e irracional donde tenemos que poder representar la hora del día como de 06:00:00 a 30:00:00 en lugar de 0:00:00 a las 24:00:00. ¿Hay alguna forma de hacer esto usando el tipo DateTime? Si trato de construir un tiempo de fecha con un valor de hora mayor que 24, arroja una excepción.Almacenar más de 24 horas en un DateTime

+0

Estoy intrigado. ¿Qué industria es esta? –

+5

Fabricante de TARDIS. – JohnFx

+0

@JohnFx - es el 1 de abril después de todo –

Respuesta

2

¿Qué le parece usar un TimeSpan en su lugar?

DateTime departure = new DateTime(2010, 6, 12, 18, 32, 0); 
DateTime arrival = new DateTime(2010, 6, 13, 22, 47, 0); 
TimeSpan travelTime = arrival - departure; 
Console.WriteLine("{0} - {1} = {2}", arrival, departure, travelTime); 

A continuación, utilice la propiedad TotalHours del TimeSpan obj

+0

Lo intenté con TimeSpan, sin embargo, cualquier horario superior a 24 pasará al día. Entonces, por ejemplo, 36:00:00 terminaría siendo 1: 12: 00: 00 como un TimeSpan. – Rob

+1

¿Cómo es esto un problema? Simplemente use suTimeSpan.TotalHours. –

+0

@Rob usa la propiedad TotalHours del obj TimeSpan entonces. – Gabe

2

dudo que puede hacer exactamente lo que está buscando, pero espero que usted podría hacer su propia clase DateTime que no hace sino aumentar +6 horas al valor. es decir, almacena 00 - 24 internamente, pero los métodos get/set hacen que parezca 06 - 30.

+0

Sí, puede heredar de la clase de tiempo de fecha existente y anular los métodos/propiedades que implican la hora –

+1

@Chris Simpson, no puede heredar de la estructura DateTime existente. –

+1

Necesita usar TimeSpan para algo como esto. – Gabe

0

Solo tiene su lógica de negocios store/return DateTime.Hours.Add (6). Tendrás que ser consciente de esto en tu lógica de visualización.

0

cómo usar un DateTime normal para almacenar la hora actual, y escribir una nueva clase que almacena (o deriva de) un DateTime, y tiene un ToString() que ajusta la salida.

0
  1. Debe utilizar TimeSpan, no DateTime.
  2. Las opciones de formato para TimeSpan es

    a: [días] [horas]:. [Minutos]: [segundos] [segundos fraccionarios]

    B:. [Días] [horas].: [minutos]: [segundos]

    c:. [días] [horas]: [minutos]

    d: [días] [horas]

    e:. [días]

    f: [hora]: [minutos]: [segundos] [segundos fraccionarios]

    G:. [Hora]: [minutos]: [segundos]

    h: [hora]: [minutos]

+0

Gracias, estoy totalmente de acuerdo :) – Gabe

10

Creo que esto debería ser solo un problema de presentación.

Permita que los usuarios ingresen datos en este formato extraño e inmediatamente conviértalo a UTC. Haga todos los cálculos en las horas UTC. A continuación, cree un método ToString para convertir los resultados nuevamente en su formato extraño. Probablemente también necesite otros métodos y propiedades de utilidad, como una implementación de WeirdDateTime.Day.

Puede escribir una clase contenedora alrededor de un DateTime y tener todos los métodos de conversión y utilidad que necesita en esa clase. He intentado iniciarlo al implementar el análisis de una cadena en un formato extraño. Esto no es un código de producción listo de ninguna manera, pero quizás le puede dar algunas ideas de cómo puede acercarse a esto:

class WeirdDateTime 
{ 
    public DateTime DateTime { get; set; } 

    public WeirdDateTime(int year, int month, int day, int hour, int minute, int second, DateTimeKind kind) 
    { 
     if (hour < 6 || hour >= 30) 
      throw new ArgumentException("Not a valid WeirdDateTime", "hour"); 

     bool addDay; 
     if (hour >= 24) 
     { 
      addDay = true; 
      hour -= 24; 
     } 
     else 
     { 
      addDay = false; 
     } 

     DateTime dateTime = new DateTime(year, month, day, hour, minute, second, kind); 
     if (addDay) 
      dateTime = dateTime.AddDays(1); 

     DateTime = dateTime; 
    } 

    public static WeirdDateTime Parse(string s) 
    { 
     Regex regex = new Regex(@"(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})"); 
     Match match = regex.Match(s); 
     if (!match.Success) 
      throw new FormatException("Not a valid WeirdDateTime"); 

     int[] parts = match.Groups.Cast<Group>() 
      .Skip(1) 
      .Select(x => int.Parse(x.Value)) 
      .ToArray(); 

     int year = parts[0]; 
     int month = parts[1]; 
     int day = parts[2]; 
     int hour = parts[3]; 
     int minute = parts[4]; 
     int second = parts[5]; 

     return new WeirdDateTime(year, month, day, hour, minute, second, DateTimeKind.Unspecified); 
    } 

    public override string ToString() 
    { 
     throw new NotImplementedException("Write this!"); 
    } 
} 

class Program 
{ 
    public static void Main() 
    { 
     WeirdDateTime weirdDateTime = WeirdDateTime.Parse("2010-01-19 27:00:00"); 
     DateTime dateTimeUtc = weirdDateTime.DateTime.ToUniversalTime(); 
     Console.WriteLine(dateTimeUtc); 
    } 
} 
Cuestiones relacionadas