web-dev-qa-db-ja.com

日付時刻文字列に時刻が含まれているかどうかを確認します

問題が発生しました。データベースから日時文字列を取得していますが、これらの日時文字列の一部に時間が含まれていません。しかし、新しい要件については、すべての日付時刻文字列にそのような時間を含める必要があります。

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);

ただし、これはNo 1)タイプのタイムスタンプでのみ機能します。この日付時刻文字列に時間要素が存在するかどうかを検出する方法について、このタスクを実行する方法を教えてください。どうもありがとうございました :)

POSSIBLE MATCH「日付と時刻」文字列に時間しかないかどうかを検証する方法

[〜#〜] info [〜#〜]Arun Selva KumarGuru KaraPatipol Paripoonnanondaによって提供される3つの回答はすべて正しいものであり、時間をチェックして、目的。しかし、私は使いやすさと、彼が与えた説明のためだけにGuru Karas回答を選択します。どうもありがとうございました:)皆様に感謝します:)

21
Hasitha Shan

日時コンポーネント TimeOfDay が必要です。

MSDNは「時間コンポーネントなしで日付を表すDateTime値を返すDateプロパティとは異なり、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");
}
24
Guru Kara

これを試して、

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

9

Guru Kara および Patipol 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が解析できる形式の真夜中以外の時刻を検索します。

制限:

  • カルチャ以外のローカル形式の明示的な深夜時刻は検出されません。
  • 2つ未満の部分を持つ明示的な真夜中の時間は検出されません。そして
  • グルカラとパティポールパリポナノンダのアプローチよりもシンプルでエレガントではありません。
4

ここでは、私が今行っていることを説明します。完璧ではないかもしれませんが、午前12時の日時を時間がないと見なすよりはましです。前提として、最後にフルタイムの仕様を付けた場合、日付だけの場合は解析されますが、すでに時間コンポーネントがある場合は失敗します。

空白文字以外の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));
    }
}
0
Zephryl