J'ai rencontré un problème. J'obtiens une chaîne d'heure date de la base de données et certaines de ces chaînes d'heure date ne contiennent pas l'heure. Mais comme pour la nouvelle exigence, chaque chaîne de date/heure doit contenir l'heure ainsi,
1) 1980/10/11 12:00:01
2) 2010/APRIL/02 17:10:00
3) 10/02/10 03:30:34
La date peut être dans n'importe quel format suivi de l'heure en notation 24hr
.
J'ai essayé de détecter l'existence du temps via le code suivant,
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);
Mais cela ne fonctionne que pour les horodatages de type No 1)
. Puis-je savoir comment réaliser cette tâche sur la manière de détecter si l'élément time existe dans cette chaîne d'heure date/heure. Merci beaucoup :)
MATCH POSSIBLE Comment valider si une chaîne "date et heure" a seulement une heure?
INFOles trois réponses fournies par Arun Selva Kumar
, Guru Kara
, Patipol Paripoonnanonda
sont toutes correctes, vérifie l'heure et me sert à la tâche. Mais je sélectionne Guru Kara
s répondre uniquement sur la facilité d'utilisation et l'explication qu'il a donnée. Merci beaucoup :) très apprécié vous tous :)
Les composants date/heure TimeOfDay est ce dont vous avez besoin.
MSDN indique "Contrairement à la propriété Date, qui renvoie une valeur DateTime qui représente une date sans son composant heure, la propriété TimeOfDay renvoie une valeur TimeSpan qui représente le composant heure d'une valeur DateTime."
Voici un exemple prenant en compte tous vos scénarios.
Puisque vous êtes sûr du format, vous pouvez utiliser DateTime.Parse
sinon veuillez utiliser 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");
}
Essaye ça,
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
}
Vous pouvez essayer d’utiliser d’autres spécificateurs de format tels qu’énumérés ici, http://msdn.Microsoft.com/en-us/library/8kb3ddd4.aspx
En combinant les réponses de Guru Kara et Patipol Paripoonnanonda avec l’API de mondialisation .net, on obtient:
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;
}
Cette approche:
TimeOfDay
indique minuit ou aucune heure explicite; etLimites:
Voici ce que je vais avec pour l'instant. Ce n'est peut-être pas parfait, mais probablement mieux que de considérer n'importe quelle heure datée de 12 heures comme n'ayant pas l'heure. La prémisse est que si je pointe une spécification à temps plein à la fin, elle sera analysée s'il ne s'agit que d'une date mais échouera si elle a déjà une composante de temps.
Je devais supposer qu'il n'y avait pas de date/heure valide comportant 7 caractères non blancs ou moins. Il semble que "1980/10" soit analysé, mais pas "1980/10 01: 01: 01.001".
J'ai inclus divers cas de test. N'hésitez pas à ajouter les vôtres et à me faire savoir s'ils échouent.
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));
}
}