Last active
March 8, 2021 14:52
-
-
Save guitarrapc/683ff5850f81da344a0d96866016c428 to your computer and use it in GitHub Desktop.
Convert 1d1h1m1s format to TimeSpan, and viceversa.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void Main() | |
{ | |
Durations.FromString("10d").Dump(); | |
Durations.FromString("10h").Dump(); | |
Durations.FromString("10m").Dump(); | |
Durations.FromString("10s").Dump(); | |
Durations.FromString("100d10h10m10s").Dump(); | |
Durations.FromString("100d10h10s").Dump(); | |
Durations.FromString("0").Dump(); | |
Durations.ToString(TimeSpan.FromDays(10)).Dump(); | |
Durations.ToString(TimeSpan.FromHours(10)).Dump(); | |
Durations.ToString(TimeSpan.FromMinutes(10)).Dump(); | |
Durations.ToString(TimeSpan.FromSeconds(10)).Dump(); | |
Durations.ToString(new TimeSpan(100, 10, 10, 10)).Dump(); | |
Durations.ToString(new TimeSpan(100, 10, 0, 10)).Dump(); | |
Durations.ToString(TimeSpan.Zero).Dump(); | |
} | |
public class Durations | |
{ | |
private const char DayChar = 'd'; | |
private const char HourChar = 'h'; | |
private const char MinuteChar = 'm'; | |
private const char SecondChar = 's'; | |
/// <summary> | |
/// Convert 1d1h1m1s format to TimeSpan | |
/// </summary> | |
/// <param name="text"></param> | |
/// <returns></returns> | |
public static TimeSpan FromString(string text) | |
{ | |
var dResult = ExtractNumber(text, DayChar); | |
var hResult = ExtractNumber(dResult.leastText, HourChar); | |
var mResult = ExtractNumber(hResult.leastText, MinuteChar); | |
var sResult = ExtractNumber(mResult.leastText, SecondChar); | |
return TimeSpan.FromSeconds(dResult.number * 24 * 60 * 60 + hResult.number * 60 * 60 + mResult.number * 60 + sResult.number); | |
} | |
/// <summary> | |
/// Convert TimeSpan to 1d1h1m1s format | |
/// </summary> | |
/// <param name="input"></param> | |
/// <returns></returns> | |
public static string ToString(TimeSpan input) | |
{ | |
var text = ""; | |
if (input.Days != 0) | |
text += $"{input.Days}{DayChar}"; | |
if (input.Hours != 0) | |
text += $"{input.Hours}{HourChar}"; | |
if (input.Minutes != 0) | |
text += $"{input.Minutes}{MinuteChar}"; | |
if (input.Seconds != 0) | |
text += $"{input.Seconds}{SecondChar}"; | |
if (string.IsNullOrEmpty(text)) | |
text = "0"; | |
return text; | |
} | |
private static (string leastText, int number) ExtractNumber(string text, char charactor) | |
{ | |
if (string.IsNullOrEmpty(text)) | |
return ("", 0); | |
var num = 0; | |
var index = text.IndexOf(charactor); | |
if (index != -1) | |
{ | |
if (!int.TryParse(text.Substring(0, index), out num)) | |
throw new FormatException($"Invalid Format detected at {text}."); | |
text = text.Substring(index, text.Length - index).TrimStart(charactor); | |
} | |
return (text, num); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment