如何在C#中解析没有日期的datetime?

时间:2018-12-09 14:02:03

标签: c# datetime

如果我有一个类似15:00的字符串,并将其解析为DateTimeDateTimeOffset,则日期设置为今天。

我想以某种方式区分日期部分是否给出。如果未提供日期部分,日期将为1.1.1970

有没有比使用正则表达式自己解析的更好的机会了?

3 个答案:

答案 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,日期设置为今天。

这是设计使然。

来自DateTime.Parse doc

  

一个带有时间但没有日期成分的字符串。该方法假定   当前日期,除非您调用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日。

来自DateTimeOffset.Parse doc

  

如果缺少,则默认值为当前日期

因此,对于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

取决于您的本地化:-)