C#
에서 날짜 관련하여 DateTime
을 많이 사용합니다.
이 DateTime
을 자르거나 반올림, 반내림, 가까운 값을 자동으로 찾는 법을 알아봅시다.
DateTime 자르기
/// <summary>
/// 시간을 원하는 구간(timeSpan)으로 자르는 함수
/// 출처 : https://stackoverflow.com/a/1005222
/// </summary>
/// <param name="dateTime">시간</param>
/// <param name="timeSpan">자를 TimeSpan</param>
/// <returns></returns>
public static DateTime Truncate(this DateTime dateTime, TimeSpan timeSpan)
{
if (timeSpan == TimeSpan.Zero)
return dateTime;
if (dateTime == DateTime.MinValue ||
dateTime == DateTime.MaxValue)
return dateTime;
return dateTime.AddTicks(-(dateTime.Ticks % timeSpan.Ticks));
}
이 함수는 입력된 시간dateTime
을 원하는 구간timeSpan
으로 자르는 함수입니다.
public static void Main()
{
DateTime dateTime = DateTime.Now;
Console.WriteLine($"{dateTime.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
// 초 단위로 자르기 (Milliseconds 없애기)
Console.WriteLine($"{Truncate(dateTime, TimeSpan.FromSeconds(1.0)).ToString("yyyy-MM-dd HH:mm:ss.fff")}");
// 분 단위로 자르기 (Seconds 없애기)
Console.WriteLine($"{Truncate(dateTime, TimeSpan.FromMinutes(1.0)).ToString("yyyy-MM-dd HH:mm:ss.fff")}");
}
사용은 위와 같이 시간을 입력dateTime
하고 원하는 구간timeSpan
을 넣어주면 됩니다.
테스트 소스는 아래와 같습니다.
DateTime의 시간 반올림/반내림/가까운 값
DateTime
을 자르지 않고 근처의 값으로 반올림, 반내림 하는 방법을 살펴봅시다.
/// <summary>
/// 시간을 원하는 구간(timeSpan) 근처의 값을 찾는 함수
/// https://stackoverflow.com/a/20046261
/// </summary>
/// <param name="dateTime">시간</param>
/// <param name="timeSpan">자를 TimeSpan</param>
/// <returns></returns>
public static DateTime RoundToNearest(DateTime dateTime, TimeSpan timeSpan)
{
long lDelta = dateTime.Ticks % timeSpan.Ticks;
bool bIsRoundUp = lDelta > timeSpan.Ticks / 2;
long lOffset = bIsRoundUp ? timeSpan.Ticks : 0;
return new DateTime(dateTime.Ticks + lOffset - lDelta, dateTime.Kind);
}
이 함수는 입력된 시간dateTime
을 원하는 구간timeSpan
근처의 값을 찾습니다.
즉, 현재 시간은 11:00:07.820
인데 TimeSpan이 FromSeconds(1.0)
이라면 11:00:08.000
을 반환하게 됩니다.
public static void Main()
{
DateTime dateTime = DateTime.Now;
Console.WriteLine($"{dateTime.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
// 밀리초 단위에서 반올림
Console.WriteLine($"{RoundToNearest(dateTime, TimeSpan.FromSeconds(1.0)).ToString("yyyy-MM-dd HH:mm:ss.fff")}");
// 초 단위에서 반올림
Console.WriteLine($"{RoundToNearest(dateTime, TimeSpan.FromMinutes(1.0)).ToString("yyyy-MM-dd HH:mm:ss.fff")}");
}
테스트 소스는 아래와 같습니다.
참고 자료
'Study > C#, Winform' 카테고리의 다른 글
[C#] 배열 정렬 기능 (Sort) (0) | 2022.12.10 |
---|---|
[C# Winform] DataGridView Column Header Drag (컬럼 헤더 드래그) (0) | 2022.10.24 |
[C#] Enumerable 에서 중복 데이터 삭제 (Distinct) (0) | 2022.10.06 |
[C# Winform] 스크롤바 크기 (넓이) (0) | 2022.10.04 |
[C# Winform] Context Menu를 Button 옆에 띄우기 (0) | 2022.09.28 |