C# 如何在C中将每种格式转换为秒#
我的应用程序是C#,我试图创建一个方法,将传递的值转换为秒(时间),即将到来的格式不是固定的,由用户提供,因此它是动态的。它可以是hh:mm或mm:ss或hh:mm:ss,可以是任何有效的时间格式。我将从某个文件获得的值将始终是时间部分。用户将根据条件/要求传递格式。它可以是任何有效的时间格式 我已经试过了C# 如何在C中将每种格式转换为秒#,c#,datetime,data-conversion,C#,Datetime,Data Conversion,我的应用程序是C#,我试图创建一个方法,将传递的值转换为秒(时间),即将到来的格式不是固定的,由用户提供,因此它是动态的。它可以是hh:mm或mm:ss或hh:mm:ss,可以是任何有效的时间格式。我将从某个文件获得的值将始终是时间部分。用户将根据条件/要求传递格式。它可以是任何有效的时间格式 我已经试过了 使用Timespan.Parse,但它不接受该格式 使用Timespan.ParseExact,但我的编译器给出的错误是Timespan不包含ParseExact的定义 另一个选项是,我根据
10:20
是10小时20分钟,答案是10*3600+20*60==37200
还是10分20秒,等于10*60+20=620
秒。但是,如果您知道如何处理这种歧义,可以使用TryParseExact
:
private static double InSeconds(string value, params string[] formats) {
// if no formats provided, use default ones:
// try these formats in this particular order:
if ((null == formats) || (formats.Length <= 0))
formats = new string[] {
@"h\:m\:s",
@"h\:m",
@"m\:s" }
else
// In case of unescaped formats like "h:m" (see comments below)
// we automatically escape them
for (int i = 0; i < formats.Length; ++i)
if (formats[i] != null)
formats[i] = Regex.Replace(formats[i],
@"(?<!\\)[^A-Za-z\\]",
match => @"\" + match.Value);
TimeSpan result;
if (TimeSpan.TryParseExact(value, formats, CultureInfo.InvariantCulture, out result))
return result.TotalSeconds;
else
return double.NaN;
}
试试这个:
class TimeParser
{
Regex tripleReg = new Regex(@"([\d]{1,2}):([\d]{1,2}):([\d]{1,2})");
Regex doubleReg = new Regex(@"([\d]{1,2}):([\d]{1,2})");
public enum Format
{
HoursMinutesSeconds,
HoursMinutes,
MinutesSeconds
}
public TimeSpan Parse(string data)
{
if (tripleReg.IsMatch(data))
return Parse(data, Format.HoursMinutesSeconds);
else
{
var match = doubleReg.Match(data);
var segment = match.Groups[1];
var value = int.Parse(segment.Value);
if (value < 60)
return Parse(data, Format.MinutesSeconds);
else
return Parse(data, Format.HoursMinutes);
}
}
public TimeSpan Parse(string data, Format format)
{
TimeSpan result;
Match match;
var hours = 0;
var minutes = 0;
var seconds = 0;
switch (format)
{
case Format.HoursMinutesSeconds:
match = tripleReg.Match(data);
if (match.Success)
{
int.TryParse(match.Groups[1].Value, out hours);
int.TryParse(match.Groups[2].Value, out minutes);
int.TryParse(match.Groups[3].Value, out seconds);
}
break;
case Format.HoursMinutes:
match = doubleReg.Match(data);
if (match.Success)
{
int.TryParse(match.Groups[1].Value, out hours);
int.TryParse(match.Groups[2].Value, out minutes);
}
break;
case Format.MinutesSeconds:
match = doubleReg.Match(data);
if (match.Success)
{
int.TryParse(match.Groups[1].Value, out minutes);
int.TryParse(match.Groups[2].Value, out seconds);
}
break;
default:
break;
}
result = new TimeSpan(hours, minutes, seconds);
return result;
}
}
我不知道这是否是最好的解决方案,或者我在发布问题时是否让问题变得更复杂。下面是我已经实现的,它满足了我的需求 在获得像“01:30”这样的双格式值后,我将其转换为Datetime对象
var DateObj= Convert.ToDateTime("MyValue");
DateObj.ToString("MyFormat");
var TempVariable=DateObj.TimeOfDay.TotalSeconds;
如果此解决方案存在任何不足之处,请评论或改进我的答案您如何区分hh:mm和mm:ss?这是我认为一个很好的通用示例很难出现的主要原因with@CallumBradbury是的,不写任何附加逻辑就很难识别,这就是我想问的,如果不写长行代码就可以实现的话。假设你有
10:20
作为输入。是10小时20分还是10分20秒?模棱两可使您的任务(一般情况下)无法实现。再多的附加逻辑也无法帮助您了解用户的想法。您是说用户将提供值和格式,还是仅提供值?我尝试过使用TryParse。精确,但在编译期间,我只得到如下错误“System.Timespan不包含TryParse.Exact的定义”。@Sam Sam:请注意,Timespan.TryParseExact
(TryParse和Exact
之间没有点)答案中提到的时间格式是否受支持,或者支持更多的时间格式,以及以相同的方式传递的格式?正如我传递的格式“hh:mm”一样“它没有返回任何结果。是的,我认为这是框架问题,我的解决方案是在框架3.5中,它不支持TryParseExact方法。我正在用Framework4检查这个示例应用程序。5@SamSam:您的格式字符串可能有误,它应该是@“hh \:mm”
即小时:分钟
带强制前导零;详见
static void Main(string[] args)
{
var parser = new TimeParser();
Console.WriteLine(parser.Parse("60:34").TotalSeconds); //218040 seconds, hh:mm
Console.WriteLine(parser.Parse("55:10").TotalSeconds); //3310 seconds, mm:ss
Console.WriteLine(parser.Parse("3:33:34").TotalSeconds); //12814 seconds, hh:mm:ss
Console.WriteLine(parser.Parse("12:34", TimeParser.Format.HoursMinutes).TotalSeconds); //45240 seconds
Console.WriteLine(parser.Parse("55:10", TimeParser.Format.MinutesSeconds).TotalSeconds); //3310 seconds
Console.WriteLine(parser.Parse("3:33:34", TimeParser.Format.HoursMinutesSeconds).TotalSeconds); //12814 seconds
Console.ReadKey();
}
var DateObj= Convert.ToDateTime("MyValue");
DateObj.ToString("MyFormat");
var TempVariable=DateObj.TimeOfDay.TotalSeconds;