2010-04-01 6 views
11

저는 하루 중 시간을 0:00:00 대신에 06:00:00 - 30:00:00으로 표시 할 수 있어야하는 기괴하고 비합리적인 업계에서 일합니다. ~ 24:00:00. DateTime 형식을 사용하여이 작업을 수행 할 수있는 방법이 있습니까? 시간 값이 24보다 큰 날짜 시간을 만들려고하면 예외가 발생합니다.DateTime에 24 시간 이상 저장

+0

나는 흥미가 있습니다. 어떤 산업입니까? –

+5

TARDIS 제조 업체. – JohnFx

+0

@JohnFx - 결국 4 월 1 일입니다 –

답변

2

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

그런 다음

+0

TimeSpan을 사용해 보았지만 24 시간이 지나면 그 날로 넘어갑니다. 따라서 예를 들어 36:00:00은 TimeSpan으로 1 : 12 : 00 : 00이됩니다. – Rob

+1

어떻게 이것이 문제입니까? YourTimeSpan을 사용하십시오. 총 시간. –

+0

@Rob은 TimeSpan obj의 TotalHours 속성을 사용합니다. – Gabe

2

난 당신이 당신이 찾고있는 정확하게 무엇을 할 수 의심 OBJ 시간 범위의 TotalHours 속성을 사용,하지만 난 당신이 단순히 6 시간을 추가 자신의 날짜 시간 클래스를 만들 수 것으로 기대 가치에. 즉 내부적으로 00-24를 저장하지만 get/set 메서드를 사용하면 06-30처럼 보일 수 있습니다.

+0

예, 기존 날짜 시간 클래스에서 상속 받고 시간이 포함 된 메서드/속성을 재정의 할 수 있습니다. –

+1

@Chris Simpson, 기존 DateTime 구조체를 상속받을 수 없습니다. –

+1

이런 식으로 TimeSpan을 사용해야합니다. – Gabe

0

DateTime.Hours.Add (6)를 저장하거나 반환해야합니다. 디스플레이 로직에서이를 인식해야합니다.

0

실제 시간을 저장하고 DateTime을 저장 (또는 파생)하는 새 클래스를 작성하고 출력을 조정하는 ToString()을 사용하여 일반적인 DateTime을 사용하는 방법.

0
  1. DateTime이 아닌 TimeSpan을 사용해야합니다.
  2. 시간 범위에 대한 포맷 옵션

  3. A : [일] [시간]. [분] [초] 분별 초]

    B :. 일] [시간]. : [분] [초]

    C :. 일] [시간] : [분]

    D : 일] [시간]

    E :. 일]

    F [시간] : [분] [초] 분별 초]

    그램. [시간] : [분] [초]

    시간 [시간] : [분]

+0

고마워, 전적으로 동의 :) – Gabe

10

제 생각에는 이것이 프리젠 테이션 문제 일뿐입니다.

사용자가 이상한 형식의 데이터를 입력하고 즉시 UTC로 변환 할 수있게하십시오. 모든 계산은 UTC 시간에 수행하십시오. 그런 다음 결과를 이상한 형식으로 변환하는 ToString 메서드를 만듭니다. WeirdDateTime.Day 구현과 같은 다른 유틸리티 메소드 및 특성이 필요할 수도 있습니다.

DateTime 주위에 래퍼 클래스를 작성하고 해당 클래스에 필요한 모든 변환 및 유틸리티 메서드를 사용할 수 있습니다. 이상한 형식의 문자열에서 구문 분석을 구현하여 시작했습니다. 어떤 방법 으로든 프로덕션 코드를 준비하는 것은 아니지만 어쩌면이 방법에 접근 할 수있는 방법에 대한 아이디어를 줄 수 있습니다.

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); 
    } 
} 
관련 문제