2013-04-09 23 views
12

Znalazłem problem. Otrzymuję ciąg dat z bazy danych, a niektóre z tych łańcuchów daty nie zawierają czasu. Ale co do nowego wymogu każdym razem ciąg data powinna zawierać czas, jak tak,sprawdź, czy łańcuch daty zawiera czas

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

Data może być w dowolnym formacie, a następnie raz w 24hr notacji.

próbowałem wykryć istnienie czasu poprzez poniższym kodzie

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

ale to tylko prace dla typu znaczników czasu Nie 1). Chciałbym wiedzieć, jak osiągnąć to zadanie, jeśli chodzi o wykrywanie, czy element czasu istnieje w tym łańcuchu daty. Dziękuję bardzo :)

możliwe dopasowanie How to validate if a "date and time" string only has a time?

INFO trzy odpowiedzi udzielone przez Arun Selva Kumar, Guru Kara, Patipol Paripoonnanonda są poprawne i kontrole raz i służy mój cel. Ale ja wybieram odpowiedź wyłącznie na łatwość użycia i na wyjaśnienia, które podał. Dziękuję bardzo :) bardzo cenione was wszystkich :)

Odpowiedz

12

Elementy czas jest data TimeOfDay czego potrzebujesz.

MSDN mówi "W przeciwieństwie do właściwości Date, która zwraca wartość DateTime, która reprezentuje datę bez komponentu czasowego, właściwość TimeOfDay zwraca wartość TimeSpan, która reprezentuje składnik czasu wartości DateTime."

Oto przykład z uwzględnieniem wszystkich Twoich scenariuszy.
Ponieważ jesteś pewien formatu można użyć DateTime.Parse inny skorzystaj 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"); 
} 
+0

hej, dziękuję za odpowiedź :) przejdę przez ths n post z powrotem :) –

+2

-1: Ta metoda kończy się niepowodzeniem na dowolnym ciągu datetime o określonym czasie północy; na przykład dla "2015-02-26T00: 00" Spodziewam się wyniku "Ma czas", ale System.DateTime.Parse ("2015-02-26T00: 00"). TimeOfDay.TotalSeconds ocenia na 0.0. –

+0

W pierwszym zdaniu nazwa metody jest niepoprawna. Próbowałem go edytować, ale interfejs użytkownika stackoverflow mówi, że edycja musi składać się z co najmniej sześciu znaków. Zgadzam się również z Kasperem van den Berg, że ta odpowiedź nie spełnia wymagań. –

9

spróbować tego,

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  
} 

można spróbować przy użyciu innych specyfikatorów formatu wymienionych tutaj, http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

+0

hej thanx za odpowiedzi :) i będzie to wypróbować n zakładać z powrotem :) –

+0

Jeśli łańcuch nie jest datą, Twój inny da złą odpowiedź. Musisz użyć innego DateTime.TryParseExact dla formatu just date. – Akanksha

+0

hej próbowałem, ale zawsze daje komunikat o błędzie? czy knwo y ?? 'string a =" 08/04/2013 17:34:00 "; DateTime myDate; if (DateTime.TryParseExact (a, "dd/MM/rrrr gg: mm: ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out myDate)) { MessageBox.Show ("Popraw"); // Ciąg ma datę i godzinę } else { MessageBox.Show ("Błąd"); // String ma tylko porcję Data } ' –

-1

Data i godzina są zawsze oddzielone spacją. Najprostszym sposobem byłoby:

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

Kod ten zakłada, że ​​data zawsze istnieje.

Jeśli chcesz podjąć dalsze kroki (w przypadku, gdy data nie istnieje), można zrobić:

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 
} 

Nadzieja to pomaga!

+0

hej thanx za odpowiedź, sprawdzę to i odeślę :) –

+0

Czy miałeś okazję go wypróbować? Proszę daj mi znać. – Pat

+0

hej..hi..straszka za opóźnienie..i wybrałam odpowiedź i wyjaśniłam powód, dla którego w pytaniu .. bardzo dziękuję za pomoc :) bardzo doceniam. –

2

Łączenie odpowiedzi Guru Kara i Patipol Paripoonnanonda z.Wyniki netto globalizacja 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; 
} 

Podejście:

  • wykrywa jawne razy północy (na przykład "2015-02-26T00: 00");
  • wyszukuje tylko ciąg znaków, gdy TimeOfDay wskazuje północ lub brak wyraźnego czasu; i
  • znajduje wyraźne pory północy w formacie lokalnym i dowolnym czasie poza północnym w dowolnym formacie, który może analizować .net.

Ograniczenia:

  • wyraźne razy północy w formacie non kultury lokalnej nie są wykrywane;
  • wyraźne czasy północy z mniej niż dwiema częściami nie są wykrywane; i
  • mniej proste i eleganckie niż podejścia Guru Kara i Patipol Paripoonnanonda.
0

Oto, na co się teraz wybieram. To może nie być doskonałe, ale prawdopodobnie lepsze niż rozważenie jakiejkolwiek 12-godzinnej daty, ponieważ nie ma czasu. Założeniem jest to, że jeśli sfinalizuję specyfikację w pełnym wymiarze czasu na końcu, to przeanalizuje, czy jest to tylko data, ale kończy się niepowodzeniem, jeśli ma już składnik czasu.

Musiałem założyć, że nie ma jakiejś ważnej daty/godziny, która ma 7 znaków spoza białych znaków lub mniej. Wygląda na to, że "1980/10" parsuje, ale nie "1980/10 01: 01: 01.001".

Dołączyłem różne testy. Możesz dodać własne i daj mi znać, jeśli się nie uda.

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)); 
    } 
} 
Powiązane problemy