如果我有一个类似15:00
的字符串,并将其解析为DateTime
或DateTimeOffset
,则日期设置为今天。
我想以某种方式区分日期部分是否给出。如果未提供日期部分,日期将为1.1.1970
。
有没有比使用正则表达式自己解析的更好的机会了?
答案 0 :(得分:0)
尝试将值解析为TimeSpan
,然后尝试将其解析为DateTime
。
var data = "15:00";
if (TimeSpan.TryParse(data, out var time))
{
Console.WriteLine("Time: {0}", time);
}
else if (DateTime.TryParse(data, out var datetime))
{
Console.WriteLine("DateTime: {0}", datetime);
}
else
{
Console.WriteLine("I don't know how to parse {0}", data);
}
答案 1 :(得分:0)
如果我有一个类似“ 15:00”的字符串,并将其解析为DateTime ot DateTimeOffset,日期设置为今天。
这是设计使然。
一个带有时间但没有日期成分的字符串。该方法假定 当前日期,除非您调用
class mapTab(QWidget): view = None def __init__(self): super().__init__() mainGrid = QGridLayout() self.view = QWebView() QWebSettings.globalSettings().setAttribute(QWebSettings.DeveloperExtrasEnabled, True); self.view.settings().setAttribute(QWebSettings.JavascriptEnabled, True) self.view.load(QUrl.fromLocalFile(QDir.current().absoluteFilePath('map.html'))) addMarkerButton = QPushButton('addMarker', self) addMarkerButton.clicked.connect(lambda state : self.AddMarker()) mainGrid.addWidget(self.view, 0,0) mainGrid.addWidget(addMarkerButton, 1,0) self.setLayout(mainGrid) def AddMarker(self): print('add marker function') self.view.page().mainFrame().evaluateJavaScript("addMarker(Paris)")
重载并包含Parse(String, IFormatProvider, DateTimeStyles)
在styles参数中,其中 如果该方法假定日期为0001年1月1日。
如果缺少,则默认值为当前日期。
因此,对于DateTimeStyles.NoCurrentDateDefault
,如果您不使用任何DateTime
,则会得到当前日期
DateTimeStyles
但是如果您使用var hours = "15:00";
var date = DateTime.Parse(hours, CultureInfo.InvariantCulture); // 12/9/2018 3:00:00 PM
作为第三个参数;
DateTimeStyles.NoCurrentDateDefault
但是我认为您的问题仍然存在。 “是否提供日期部分。”您如何确定字符串是否具有日期部分?它总是像Steve commented一样有5个字符吗?它可以采用var hours = "15:00";
var date = DateTime.Parse(hours, CultureInfo.InvariantCulture, DateTimeStyles.NoCurrentDateDefault);
// 1/1/0001 3:00:00 PM
之类的格式吗? 4:00
呢?如果它类似于4:1
,应该将其解析为4:1
还是4:10
?
因此,对于您的情况,您需要首先确定“是否提供日期部分..”的含义。然后,您可以轻松地将字符串解析为4:01
,我认为不是 TimeSpan
,因此,您可以使用DateTime
将其手动创建为“ 1.1.1970”构造函数。
DateTime(int, int, int)
使用正则表达式进行DateTime解析通常不是一个好主意。除非您没有其他方法可以在DateTime上使用它,否则我不建议您使用它。
答案 2 :(得分:0)
在这种情况下,我认为您可以保持简单。当只有时间段时,这可能是一种不依赖于长度的解决方案:
void Main()
{
Console.WriteLine(ParseWithDummyIfDateAbsent("15:00", new DateTime(1970, 1, 1)));
Console.WriteLine(ParseWithDummyIfDateAbsent("15:00:22", new DateTime(1970, 1, 1)));
Console.WriteLine(ParseWithDummyIfDateAbsent("09.12.2018 15:00", new DateTime(1970, 1, 1)));
}
DateTime ParseWithDummyIfDateAbsent(string input, DateTime dummyDate)
{
if(TimeSpan.TryParse(input, out var timeSpan))
input = $"{dummyDate.Date.ToShortDateString()} {input}";
return DateTime.Parse(input);
}
输出:
01.01.1970 15:00:00
01.01.1970 15:00:22
09.12.2018 15:00:00
取决于您的本地化:-)