30

我遇到了一个问题。我正在从数据库中获取日期时间字符串,其中一些日期时间字符串不包含时间。但是对于新的要求,每个日期时间字符串都应该包含这样的时间,

1) 1980/10/11 12:00:01 2) 2010/APRIL/02 17:10:00 3)10/02/10 03:30:34

日期可以是任何格式,后跟时间24hr表示法。

我试图通过以下代码检测时间的存在,

string timestamp_string = "2013/04/08 17:30";
DateTime timestamp = Convert.ToDateTime(timestamp_string);
string time ="";

if (timestamp_string.Length > 10)
{
    time = timestamp.ToString("hh:mm");
}
else {
    time = "Time not registered";
}

MessageBox.Show(time);

但这仅适用于 No1)类型的时间戳。我可以知道如何完成这个关于如何检测时间元素是否存在于这个日期时间字符串中的任务。非常感谢你 :)

可能的匹配 如何验证“日期和时间”字符串是否只有时间?

INFOArun Selva Kumar , Guru Kara,提供的三个答案Patipol Paripoonnanonda都是正确的,并且检查了时间并符合我的目的。但我Guru Kara仅出于易用性和他给出的解释而选择答案。非常感谢:)非常感谢你们所有人:)

4

5 回答 5

33

日期时间组件TimeOfDay是您所需要的。

MSDN 说“与 Date 属性不同,它返回一个 DateTime 值,该值表示没有其时间分量的日期,TimeOfDay 属性返回一个表示 DateTime 值的时间分量的 TimeSpan 值。”

这是一个考虑了所有场景的示例。
由于您确定可以使用的格式,DateTime.Parse否则请使用DateTime.TryParse

var dateTime1 = System.DateTime.Parse("1980/10/11 12:00:00");
var dateTime2 = System.DateTime.Parse("2010/APRIL/02 17:10:00");
var dateTime3 = System.DateTime.Parse("10/02/10 03:30:34");
var dateTime4 = System.DateTime.Parse("02/20/10");

if (dateTime1.TimeOfDay.TotalSeconds == 0) {
    Console.WriteLine("1980/10/11 12:00:00 - does not have Time");
} else {
    Console.WriteLine("1980/10/11 12:00:00 - has Time");
}

if (dateTime2.TimeOfDay.TotalSeconds == 0) {
    Console.WriteLine("2010/APRIL/02 17:10:00 - does not have Time");
} else {
    Console.WriteLine("2010/APRIL/02 17:10:00 - Has Time");
}

if (dateTime3.TimeOfDay.TotalSeconds == 0) {
    Console.WriteLine("10/02/10 03:30:34 - does not have Time");
} else {
    Console.WriteLine("10/02/10 03:30:34 - Has Time");
}

if (dateTime4.TimeOfDay.TotalSeconds == 0) {
    Console.WriteLine("02/20/10 - does not have Time");
} else {
    Console.WriteLine("02/20/10 - Has Time");
}
于 2013-04-09T05:07:39.450 回答
8

试试这个,

DateTime myDate;
if (DateTime.TryParseExact(inputString, "dd-MM-yyyy hh:mm:ss", 
    CultureInfo.InvariantCulture, DateTimeStyles.None, out myDate))
{
    //String has Date and Time
}
else
{
    //String has only Date Portion    
}

您可以尝试使用此处列出的其他格式说明符, http: //msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

于 2013-04-09T04:38:42.227 回答
5

Guru KaraPatipol Paripoonnanonda的答案与 .net 全球化 API 相结合,可以得出:

bool HasExplicitTime(DateTime parsedTimestamp, string str_timestamp)
{
    string[] dateTimeSeparators = { "T", " ", "@" };
    string[] timeSeparators = {
        CultureInfo.CurrentUICulture.DateTimeFormat.TimeSeparator,
        CultureInfo.CurrentCulture.DateTimeFormat.TimeSeparator,
        ":"};

    if (parsedTimestamp.TimeOfDay.TotalSeconds != 0)
        return true;

    string[] dateOrTimeParts = str_timestamp.Split(
            dateTimeSeparators,
            StringSplitOptions.RemoveEmptyEntries);
    bool hasTimePart = dateOrTimeParts.Any(part =>
            part.Split(
                    timeSeparators,
                    StringSplitOptions.RemoveEmptyEntries).Length > 1);
    return hasTimePart;
}

这种方法:

  • 检测明确的午夜时间(例如“2015-02-26T00:00”);
  • TimeOfDay仅在指示午夜或没有明确时间时搜索字符串;和
  • 查找本地格式的显式午夜时间和 .net 可以解析的任何格式的任何非午夜时间。

限制:

  • 未检测到非文化本地格式的明确午夜时间;
  • 未检测到少于两个部分的明确午夜时间;和
  • 不如 Guru Kara 和 Patipol Paripoonnanonda 的方法简单和优雅。
于 2015-02-26T12:37:16.677 回答
0

这就是我现在要做的。它可能并不完美,但可能比将任何 12am 日期时间视为没有时间更好。前提是,如果我最后加上一个完整的时间规范,它会解析它是否只是一个日期,但如果它已经有一个时间组件则失败。

我不得不假设不存在包含 7 个或更少非空白字符的有效日期/时间。似乎“1980/10”解析,但不是“1980/10 01:01:01.001”。

我已经包含了各种测试用例。随意添加你自己的,如果他们失败了,请告诉我。

public static bool IsValidDateTime(this string dateString, bool requireTime = false)
{
    DateTime outDate;
    if(!DateTime.TryParse(dateString, out outDate)) return false;

    if (!requireTime) return true;
    else
    {
        return Regex.Replace(dateString, @"\s", "").Length > 7 
&& !DateTime.TryParse(dateString + " 01:01:01.001", out outDate);
    }
}

public void DateTest()
{
    var withTimes = new[]{
    "1980/10/11 01:01:01.001",
    "02/01/1980 01:01:01.001",
    "1980-01-01 01:01:01.001",
    "1980/10/11 00:00",
    "1980/10/11 1pm",
    "1980-01-01 00:00:00"};

    //Make sure our ones with time pass both tests
    foreach(var date in withTimes){
        Assert.IsTrue(date.IsValidDateTime(), String.Format("date: {0} isn't valid.", date));
        Assert.IsTrue(date.IsValidDateTime(true), String.Format("date: {0} does have time.", date));
    }

    var withoutTimes = new[]{
    "1980/10/11",
    "1980/10",
    "1980/10 ",
    "10/1980",
    "1980 01",
    "1980/10/11 ",
    "02/01/1980",
    "1980-01-01"};

    //Make sure our ones without time pass the first and fail the second
    foreach (var date in withoutTimes)
    {
        Assert.IsTrue(date.IsValidDateTime(), String.Format("date: {0} isn't valid.", date));
        Assert.IsFalse(date.IsValidDateTime(true), String.Format("date: {0} doesn't have time.", date) );
    }

    var bogusTimes = new[]{
    "1980",
    "1980 01:01",
    "80 01:01",
    "1980T01",
    "80T01:01",
    "1980-01-01T01",
    };

    //Make sure our ones without time pass the first and fail the second
    foreach (var date in bogusTimes)
    {
        DateTime parsedDate;
        DateTime.TryParse(date, out parsedDate);
        Assert.IsFalse(date.IsValidDateTime(), String.Format("date: {0} is valid. {1}", date, parsedDate));
        Assert.IsFalse(date.IsValidDateTime(true), String.Format("date: {0} is valid. {1}", date, parsedDate));
    }
}
于 2016-06-06T21:11:04.900 回答
-1

日期和时间总是用空格键隔开。最简单的方法是:

if (timestamp_string.Split(' ').Length == 2)
{
    // timestamp_string has both date and time
}
else
{
    // timestamp_string only has the date
}

此代码假定日期始终存在。

如果您想进一步了解(如果日期不存在),您可以执行以下操作:

if (timestamp_string.Split(' ')
                    .Select(item => item.Split(':').Length > 1)
                    .Any(item => item))
{
    // this would work for any string format that contains date, for example:
    // 2012/APRIL/03 12:00:05 -> this would work
    // 2013/04/05 09:00:01 -> this would work
    // 08:50:45 2013/01/01 -> this would also work
    // 08:50:50 -> this would also work
}
else
{
    // no date in the timestamp_string at all
}

希望这可以帮助!

于 2013-04-09T05:14:58.233 回答