2013-04-09 19 views
12

Ho riscontrato un problema. Sto ottenendo una stringa di data e ora dal database e alcune di queste stringhe di data e ora non contengono il tempo. Ma per quanto riguarda il nuovo requisito ogni stringa di tempo data dovrebbe contenere il tempo in questo modo,controlla se la stringa dell'ora della data contiene l'ora

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

data può essere in qualsiasi formato seguita dal tempo in 24hr notazione.

ho cercato di rilevare l'esistenza di tempo tramite il seguente codice,

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

Ma questo funziona solo per il tipo timestamp No 1). Posso sapere come ottenere questo compito su come rilevare se l'elemento temporale esiste in questa stringa di data e ora. La ringrazio molto :)

possibile corrispondenza How to validate if a "date and time" string only has a time?

INFORMAZIONI le tre risposte fornite dai Arun Selva Kumar, Guru Kara, Patipol Paripoonnanonda sono tutti corretti e controlli per il tempo e serve il mio scopo. Ma seleziono la risposta Guru Kara s esclusivamente sulla facilità d'uso e per la spiegazione che ha dato. La ringrazio molto :) molto apprezzato tutti voi :)

risposta

12

I componenti di tempo data TimeOfDay è quello che ti serve.

MSDN dice "A differenza della proprietà Date, che restituisce un valore DateTime che rappresenta una data senza componente time, la proprietà TimeOfDay restituisce un valore TimeSpan che rappresenta il componente orario di un valore DateTime."

Ecco un esempio con considerazione di tutti i tuoi scenari.
Dal momento che si è sicuri del formato è possibile utilizzare DateTime.Parse altro si prega di utilizzare 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

hey grazie per la risposta :) andrò attraverso THS n palo :) –

+2

-1: Questo metodo non riesce in qualsiasi stringa datetime con un tempo specificato di mezzanotte; per esempio. per "2015-02-26T00: 00" mi aspetto un risultato di "Ha tempo", ma System.DateTime.Parse ("2015-02-26T00: 00"). TimeOfDay.TotalSeconds restituisce 0.0. –

+0

Nella prima frase, il nome del metodo è scritto erroneamente. Ho provato a modificarlo, ma l'interfaccia utente StackOverflow dice che le modifiche devono essere di almeno sei caratteri. Inoltre, sono d'accordo con Kasper van den Berg che questa risposta non soddisfa i requisiti. –

9

Prova questo,

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  
} 

Puoi provare a utilizzare altri identificatori di formato come elencato qui, http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

+0

hey thanx per la risposta :) cercherò questo fuori n post indietro :) –

+0

Se la stringa non è una data, il vostro altro darà risposta sbagliata. È necessario utilizzare un altro DateTime.TryParseExact per il solo formato della data. – Akanksha

+0

hey ho provato questo ma dà sempre il messaggio di errore? ti amo? 'string a =" 08/04/2013 17:34:00 "; DateTime myDate; se (DateTime.TryParseExact (a, "dd/MM/yyyy hh: mm: ss", CultureInfo.InvariantCulture, DateTimeStyles.None, fuori myDate)) { MessageBox.Show ("Correct"); // La stringa ha data e ora } altro { MessageBox.Show ("Errore"); // String ha solo Data Porzione } ' –

-1

Data e ora sono sempre separati da una barra di spazio. Il modo più semplice sarebbe:

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

Questo codice presuppone che la data esista sempre.

Se si vuole prendere ulteriormente (nel caso in cui la data non esiste), si può fare:

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 
} 

Spero che questo aiuti!

+0

hey grazie per la risposta controllerò questo e postback :) –

+0

Hai avuto la possibilità di provarlo? Per favore mi faccia sapere. – Pat

+0

hey..hi..sospidi per il ritardo..ho selezionato una risposta e ho spiegato il motivo per cui nella domanda stessa .. molte grazie per l'aiuto :) molto apprezzato. –

2

Combinando le risposte di Guru Kara e Patipol Paripoonnanonda con.net risultati globalizzazione API in:

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

Questo approccio:

  • rileva i tempi di mezzanotte espliciti (ad esempio "2015-02-26T00: 00");
  • cerca solo la stringa quando TimeOfDay indica mezzanotte o nessun orario esplicito; e
  • trova orari di mezzanotte espliciti in formato locale e qualsiasi ora non di mezzanotte in qualsiasi formato che .net possa analizzare.

Limitazioni:

  • esplicite volte a mezzanotte in formato locale non cultura non vengono rilevati;
  • orari di mezzanotte espliciti con meno di due parti non rilevati; e
  • meno semplici ed eleganti rispetto agli approcci di Guru Kara e Patipol Paripoonnanonda.
0

Ecco cosa sto andando per ora. Potrebbe non essere perfetto, ma probabilmente meglio di considerare qualsiasi data/ora 12 am che non ha tempo. La premessa è che se applico una specifica a tempo pieno alla fine, essa analizzerà se è solo una data, ma fallirà se ha già una componente temporale.

Ho dovuto supporre che non ci sia una data/ora valida che abbia 7 caratteri non spazi bianchi o meno. Sembra che "1980/10" analizzi, ma non "1980/10 01: 01: 01.001".

Ho incluso vari casi di test. Sentiti libero di aggiungere il tuo e fammi sapere se falliscono.

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)); 
    } 
} 
Problemi correlati