Skip to content

Instantly share code, notes, and snippets.

@guitarrapc
Last active March 8, 2021 14:52
Show Gist options
  • Save guitarrapc/683ff5850f81da344a0d96866016c428 to your computer and use it in GitHub Desktop.
Save guitarrapc/683ff5850f81da344a0d96866016c428 to your computer and use it in GitHub Desktop.
Convert 1d1h1m1s format to TimeSpan, and viceversa.
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