2009-03-30 10 views
1

J'ai une liste déroulante qui affiche l'heure. Par exemple 8:00 AM ou 8:30 AM.Comment convertir en datetime

Lorsque je sauvegarde cette fois dans la base de données, je veux enregistrer la date et l'heure d'aujourd'hui. par exemple: 8:00 AM comme 03/30/2009 8:00:00:000. Quelqu'un peut-il donner le code approprié pour convertir comme indiqué ci-dessus?

J'ai essayé

Convert.ToDateTime(ddlStartTime.SelectedItem.Text) 

Mais il y a une erreur indiquant « String n'a pas été reconnu comme un DateTime valide. »

+0

@Cerebrus: La meilleure réponse dans votre opinion et celle de ramyatk06. La communauté SO juge elle-même quelle réponse est la meilleure réponse par vote. Votre commentaire ci-dessus est une opposition à l'esprit général montré ici à SO. – AnthonyWJones

+0

@Anthony: C'était un commentaire fait en plaisantant et je pense que c'était assez évident. Je suis ici depuis assez longtemps pour comprendre et suivre l'esprit de SO. On m'a souvent dit (et je me serais souvenu) que la plupart des gens ici n'ont pas le sens de l'humour. – Cerebrus

+0

@Cerebrus: Suggérer que "la plupart des gens ici n'ont pas le sens de l'humour" n'est certainement pas drôle. – AnthonyWJones

Répondre

3

Réponse VB.NET pour la solution Portmans. Trop de caractères pour les commentaires inclus ici.

Dim time As String() = Me.DropDownList1.SelectedValue.Split(New Char() {":", " "}) 
Dim hours As Integer = Integer.Parse(time(0)) 
Dim minutes As Integer = Integer.Parse(time(1)) 
Dim ampm As Integer = 12 
If time(2).ToLower() = "am" Then 
    ampm = 0 
End If 
Dim dt As DateTime = DateTime.Today.AddHours(hours + ampm).AddMinutes(minutes) 
+0

@ ramyatk06: vous ne devez pas accepter ma réponse et accepter celle-ci, puisque votre question concerne spécifiquement VB.NET. – Portman

0

Lire les parties du temps que vous avez des heures et des minutes, puis utilisez le code suivant:

DateTime myDate = DateTime.Now.Date; 
myDate = myDate.AddHours(hours); 
myDate = myDate.AddMinutes(minutes); 
+0

Est-ce que cela fonctionne dans vb ?? – AnthonyWJones

+0

Aussi comment AM/PM est-il géré? – AnthonyWJones

+0

Cette solution peut être légèrement défectueuse mais elle est toujours plus propre que certaines des autres solutions présentées ici. – Cerebrus

2

Jetez un oeil à DateTime.TryParse et DateTime.Today. Les utiliser devrait être suffisant pour faire ce que vous voulez.

Code non testé.

DateTime dt; 
if (DateTime.TryParse(Dropdown1.SelectedValue, out dt)) 
{ 
    DateTime result = DateTime.Today.AddHours(dt.Hour).AddMinutes(dt.Minute); 
} 
+0

comment est ce code.can vous montrer 1 par exemple: – user42348

+0

Nice! Vous pouvez supprimer les AddHours() et AddMinutes(). DateTime.Parse, lors de l'analyse d'une seule heure, définira automatiquement la date à aujourd'hui. – Portman

+0

Merci Portman, je n'avais pas VS devant moi pour essayer. – Craig

2

Enregistrer comme valeur pour chaque élément déroulant le nombre de minutes à partir de minuit que le temps représente. Puis: -

valueToStore = DateTime.Today + TimeSpan.FromMinutes(Int32.Parse(value)) 

En stockant en utilisant l'attribut de valeur d'une option HTML pour stocker une simple représentation de la valeur que vous éliminez les codes du format dépendance réel utilisé pour afficher simplement l'ensemble des valeurs. S'il décide que la représentation des heures sera modifiée pour utiliser un format différent, le reste du code continuera à fonctionner sans être modifié.

+0

Cette solution est inutilement compliquée. Je ne vois aucun besoin de calculer le non. de minutes à partir de minuit. – Cerebrus

+0

La valeur temporelle et la représentation visuelle du temps sont couplées "sans nécessité". Il vaut mieux les découpler. Si le client veut changer la présentation de l'heure pour dire, 24 heures, alors seul le code générant la présentation doit changer. – AnthonyWJones

1
var time = this.DropDownList1.SelectedValue.Split(':', ' '); 
var hours = Int32.Parse(time[0]); 
var minutes = Int32.Parse(time[1]); 
var ampm = (time[2] == "PM") ? 12 : 0; 
var dt = DateTime.Today.AddHours(hours + ampm).AddMinutes(minutes); 

Analyser DropDownList pendant heures et minutes, puis les ajouter à DateTime.Today.

+0

Désolé, je ne sais pas comment traduire cela en VB.NET. Tout le monde est invité à pocher cette logique et écrire une réponse VB.NET. – Portman

+0

Beaucoup trop d'utilisation de var, vous avez fait cela .net 3+ – cjk

2

Fondamentalement, vous avez juste besoin d'analyser la chaîne de temps. Il sera automatiquement résolu à la date actuelle.

Dim strTime As String = "8.30am" 
Dim parsedTime As DateTime 
If DateTime.TryParseExact(strTime, "h.mmtt", New System.Globalization.DateTimeFormatInfo(), Globalization.DateTimeStyles.None, parsedTime) = True Then 
    'Parse was successful. 
Else 
    'Handle the error. 
End If 
+0

Relier la valeur du champ à sa représentation textuelle actuelle n'est pas vraiment une bonne idée. Si la représentation textuelle est modifiée, le code à analyser doit être modifié. C'est pourquoi l'option HTML a un attribut de valeur de sorte que la valeur et la présentation peuvent être découplées. – AnthonyWJones

+0

Et pourtant, c'est une décision prise par le PO. J'ai présenté une solution sur la base de la configuration existante de l'OP. Il est évident à partir de la question que la propriété SelectedItem.Text est utilisée, pas la propriété Value. – Cerebrus

+0

Tout à fait, ma suggestion est alors d'arrêter d'utiliser le texte et laisser cela pour la présentation et commencer à utiliser la valeur qui est définie à une valeur simple non ambiguë. – AnthonyWJones

0

Utilisez ParseExact afin de pouvoir spécifier le format que vous utilisez. H = heures au format 12 heures
. = Caractère littéral
mm = minutes que deux chiffres
tt = désignateur AM/PM

Dim time As DateTime = DateTime.ParseExact(dropdown.SelectedValue, "h.mmtt", CultureInfo.InvariantCulture) 

Les composants de la valeur DateTime que vous ne spécifiez pas dans la chaîne (année, mois, date, seconde, fuseau horaire, ère) utilise DateTime.Today par défaut, ce qui est exactement ce que vous voulez dans ce cas.

0

Cela semble toujours fonctionner pour moi. Peut-être pas la façon la plus élégante, mais je n'ai pas eu de problèmes jusqu'à présent.

dTime = DateTime.Now; 

string time = this.DropDownList1.SelectedValue;  

DateTime FormattedDateTime = Convert.ToDateTime(dTime.Date.ToShortDateString() + 
" " + time); 
Questions connexes