2010-04-01 17 views
11

Lavoro in un settore bizzarro e irrazionale dove dobbiamo essere in grado di rappresentare l'ora del giorno come 06:00:00 alle 30:00:00 invece di 0:00:00 alle 24:00:00. C'è un modo per farlo usando il tipo DateTime? Se provo a costruire una data con un valore orario maggiore di 24, genera un'eccezione.Conservare più di 24 ore in un DateTime

+0

Sono incuriosito. Che industria è questa? –

+5

produttore TARDIS. – JohnFx

+0

@JohnFx - è il 1 aprile dopo tutto –

risposta

2

Come si usa invece un TimeSpan?

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

quindi utilizzare la proprietà TotalHours del TimeSpan obj

+0

Ho provato a utilizzare TimeSpan, tuttavia tutte le ore oltre 24 verranno trasferite nel giorno. Quindi, ad esempio, 36:00:00 diventerebbe 1: 12: 00: 00 come TimeSpan. – Rob

+1

Come si presenta questo problema? Usa semplicemente yourTimeSpan.TotalHours. –

+0

@Rob utilizzare quindi la proprietà TotalHours dell'oggetto TimeSpan. – Gabe

2

dubito che si possa fare esattamente quello che stai cercando, ma mi aspetto che si potrebbe fare la propria classe DateTime che aggiunge semplicemente +6 ore al valore. Memorizza internamente 00 - 24, ma i metodi get/set lo fanno sembrare 06 - 30.

+0

Sì, è possibile ereditare dalla classe data ora esistente e sovrascrivere i metodi/proprietà che coinvolgono l'ora –

+1

@Chris Simpson, non è possibile ereditare dalla struttura DateTime esistente. –

+1

È necessario utilizzare TimeSpan per qualcosa di simile. – Gabe

0

Basta avere il tuo negozio di logica di business/return DateTime.Hours.Add (6). Dovrai essere consapevole di ciò nella tua logica di visualizzazione.

0

come utilizzare un normale DateTime per memorizzare l'ora effettiva e scrivere una nuova classe che memorizza (o deriva da) un DateTime e ha un ToString() che regola l'output.

0
  1. Si dovrebbe utilizzare TimeSpan, non DateTime.
  2. Le opzioni di formato Per il periodo è

    un: [giorni] [ore]:. [Minuti]: [secondi] [frazioni di secondo]

    B:. [Giorni] [ore].: [minuti]: [secondi]

    . C: [giorni] [ore]: [minuti]

    d: [giorni] [ore]

    e:. [giorni]

    f: [ore]: [minuti]: [secondi] [secondi frazionari]

    g. [Ore]: [minuti]: [secondi]

    h: [ore]: [minuti]

+0

Grazie, sono completamente d'accordo :) – Gabe

10

Penso che questo dovrebbe essere solo un problema di presentazione.

Consentire agli utenti di immettere dati in questo formato strano e convertirli immediatamente in UTC. Effettua tutti i calcoli nei tempi UTC. Quindi crea un metodo ToString per convertire i risultati nel tuo formato strano. Probabilmente avrai bisogno anche di altri metodi e proprietà di utilità come un'implementazione di WeirdDateTime.Day.

È possibile scrivere una classe wrapper attorno a un DateTime e disporre di tutti i metodi di conversione e utilità necessari per tale classe. Ho provato a iniziarlo, implementando l'analisi da una stringa in un formato strano. Questo non è un codice di produzione pronto in alcun modo, ma forse può darti alcune idee su come potresti avvicinarti a questo:

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); 
    } 
} 
Problemi correlati