2011-03-25 6 views
14

이 질문의 제목을 입력하면 this question이됩니다. 나는 똑같은 것을 찾고있다. 그러나 내가 의미하는 것을 얻으면 아마도 덜 정적으로 형식화 된 것이 될 것이다.C#의 TimeSpan "예쁜 시간"형식

저는 두 개의 DateTime 객체의 TimeSpan 기간을 가져 와서 종이로 인쇄하기 위해 출력하는 빠른 프로그램을 작성하고 있습니다.

형식은 XX days, YY hours, ZZ minutes입니다 (초는 관련이 없으며 시간대가 몇 시간을 초과하는 것으로 예상하지 않기 때문에 일입니다).

DateTime start = DateTime.Now; 
DateTime end = DateTime.Now.AddMinutes(135); 
TimeSpan duration = (end - start); 

// output duration as XX hours, YY minutes 

감사합니다,

추신 :

은 (예를 들어) 다음 코드를 말 나는 또한 "PrettyTime.NET"을 가로 질러 도망 쳤지 만, "3 일 전"과 같은 것들을 출력합니다. 위의 예제처럼 시간 지속 문자열을 형식화하기 위해 Google에서 찾은 다른 모든 주제는 저를 Java 기반 솔루션으로 안내합니다. : \


UPDATE 2014년 9월 8일 :

후속 3 년 후를, 나는 NuGet 및 Github에서에서 멋진 라이브러리를 발견했습니다라는이 문제를 해결할 것 "Humanizer" 나는 가지고 있었다. 나는 그것을 그렇게 많이 사용하지 않았지만 그것을 시도하고 아름답게 작동합니다. 라이브러리의 크기는 상당히 큽니다 (프로젝트의 빌드 경로와는 다른 문화권을위한 많은 폴더를 내 보냅니다 (사용자 정의 할 수있는 방법이 있다고 확신합니다)).

+0

포스트 자바 버전에 대한 링크는 ... C#으로 행할 수 있어야한다 : – MattC

+0

@MattC : 그게 몇 분 걸릴거야. 나는 이미 그들을 닫았다. :/ – Zack

+0

@MattC : 예. 비슷하지만 형식이 다릅니다. 어쨌든 일반적으로 동일합니다. http://tackoverflow.com/questions/3471397/pretty-print-duration-in-java – Zack

답변

29
을 당신이 복수화에 대해 신경 경우

그리고 :

public static string ToPrettyFormat(this TimeSpan span) { 

    if (span == TimeSpan.Zero) return "0 minutes"; 

    var sb = new StringBuilder(); 
    if (span.Days > 0) 
     sb.AppendFormat("{0} day{1} ", span.Days, span.Days > 1 ? "s" : String.Empty); 
    if (span.Hours > 0) 
     sb.AppendFormat("{0} hour{1} ", span.Hours, span.Hours > 1 ? "s" : String.Empty); 
    if (span.Minutes > 0) 
     sb.AppendFormat("{0} minute{1} ", span.Minutes, span.Minutes > 1 ? "s" : String.Empty); 
    return sb.ToString(); 

} 
+0

아. 보기 좋았어. +1 여기에 답변을 올린 모든 분들께 감사드립니다. ;) – Zack

+0

이렇게하면 후행 공백이 제거됩니다. sb.Remove (sb.Length - 1, 1); – solublefish

+0

이것을 고려하는 사람에게는 위 코드에 버그가 있습니다. 지속 시간이 0 초 이상 1 분 미만이면 'TimeSpan.Zero' 검사를 통과하지만 빈 문자열을 반환합니다. 'span.Seconds'를'sb'를 반환하기 전에 평가할 필요가 있습니다. –

9

할 수 있습니다이 바로 바로 출력 :

당신이 "짧은"시간을 처리 할거야, 그리고 당신이 청소기하려면
string result = string.Format("{0} days, {1} hours, {2} minutes", duration.Days, duration.Hours, duration.Minutes); 

, 당신은 같은 것을 할 수있는 :

public string PrettyFormatTimeSpan(TimeSpan span) 
{ 
    if (span.Days > 0) 
     return string.Format("{0} days, {1} hours, {2} minutes", span.Days, span.Hours, span.Minutes); 
    if (span.Hours > 0) 
     return string.Format("{0} hours, {1} minutes", span.Hours, span.Minutes); 

    return string.Format("{0} minutes", span.Minutes); 
} 
+3

+1 할 수 있다면 ... 그래서 나는 이미이 답변에 투표했습니다./ – Zack

+0

음 , 심지어 컴파일되지 않습니다. 기간을 기간으로 교체하십시오. – Henrik