2010-04-01 12 views
11

Pracuję w dziwacznej i nieracjonalnej branży, w której musimy być w stanie reprezentować porę dnia od 06:00:00 do 30:00:00 zamiast 0:00:00 do 24:00:00. Czy jest jakiś sposób to zrobić przy użyciu typu DateTime? Jeśli spróbuję skonstruować datę z wartością godziny większą niż 24, zgłasza wyjątek.Sklep przez ponad 24 godziny w DataTime

+0

Jestem zaintrygowany. Jaka jest branża? –

+5

Producent TARDIS. – JohnFx

+0

@JohnFx - jest 1 kwietnia po wszystkim –

Odpowiedz

2

Zamiast korzystać z numeru 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); 

Następnie użyj właściwość TimeSpan obj

+0

Spróbowałem użyć TimeSpan, jednak każda godzina powyżej 24 zostanie przeniesiona na dzień. Na przykład 36:00:00 skończyłoby się 1: 12: 00: 00 jako TimeSpan. – Rob

+1

W czym problem? Po prostu użyj yourTimeSpan.TotalHours. –

+0

@Rob użyj właściwości TotalHours obiektu TimeSpan obj. – Gabe

2

wątpię można zrobić dokładnie to, czego szukasz TotalHours, ale spodziewam się, że można tworzyć własne klasy DateTime, które po prostu dodaje +6 godzin do wartości. tj. przechowuje od 00 do 24 wewnętrznie, ale metody get/set sprawiają, że wydaje się, że jest to 06 - 30

+0

Tak, możesz dziedziczyć po klasie daty i zastąpić metody/właściwości związane z godziną –

+1

@Chris Simpson, nie możesz dziedziczyć z istniejącej struktury DateTime. –

+1

Musisz użyć TimeSpan, aby uzyskać coś takiego. – Gabe

0

Wystarczy mieć swój logikę biznesową sklepu/return DateTime.Hours.Add (6). Musisz być tego świadomy w swojej logice wyświetlania.

0

w jaki sposób "przy użyciu zwykłego DateTime do przechowywania czasu rzeczywistego i pisania nowej klasy, która przechowuje (lub wywodzi się) z DateTime i ma ToString(), który dostosowuje wyjście.

0
  1. Powinieneś używać TimeSpan, a nie DateTime.
  2. OPCJAMI formatu dla zakresie czasowym

    A: [dni] [godziny]. [Minuty] [s] [ułamków sekund]

    b. [Dni] [godziny].: [min]: [sekundy]

    C. [dni] [godziny] [min]

    d: [dni] [godziny]

    e. [dni]

    F: [godziny] [min]: [sekundy] [ułamków sekund]

    g. [Godziny] [min] [sekundy]

    H: [godziny] [min]

+0

Dzięki, całkowicie się zgadzam :) – Gabe

10

Myślę, że to powinno być tylko kwestia prezentacji.

Umożliwia użytkownikom wprowadzanie danych w tym dziwnym formacie i natychmiast konwertuje je na UTC. Wykonaj wszystkie obliczenia w czasie UTC. Następnie utwórz metodę ToString, aby przekonwertować wyniki z powrotem na twój dziwny format. Prawdopodobnie będziesz potrzebować również innych metod i właściwości użytkowych, takich jak implementacja WeirdDateTime.Day.

Można napisać klasę opakowującą wokół obiektu DateTime i mieć wszystkie potrzebne metody konwersji i narzędzia dla tej klasy. Miałem już go uruchomić - poprzez implementację parsowania z łańcucha w dziwnym formacie. To nie jest gotowy kod produkcyjny, ale być może może dać ci kilka pomysłów, jak możesz do tego podejść:

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); 
    } 
} 
Powiązane problemy