2011-01-31 3 views
0

J'essaie de convertir ce contenu en DateTime.Conversion au fichier Datetime

DateTime dtmNextPayment = Convert.ToDateTime(DateTime.Now.AddMonths(1).Month.ToString() + "/" + DateTime.Now.Day.ToString() + "/" + DateTime.Now.AddYears(1).Year.ToString()); 

Ici, je reçois une exception "String n'a pas été reconnu comme un datetime valide". Où vais-je mal? Quelqu'un pourrait m'aider. Nous vous remercions à l'avance ..

+0

C'était un très mauvais exemple. En fait, j'ai différents scénarios sur différentes conditions. Mon intention était de convertir en forme de mois/date/année. – Ram

+0

Nous ne pouvons pas vous aider si vous ne nous aidez pas à vous aider. Donnez-nous un bon exemple à partir duquel travailler. – jason

Répondre

4

Il y a beaucoup de problèmes ici. Tout d'abord, vous ne voulez jamais utiliser à plusieurs reprises DateTime.Now comme vous le faites. A la place,

DateTime now = DateTime.Now; 

puis d'utiliser now. La raison pour laquelle vous faites cela est parce que DateTime.Now pourrait passer à un nouveau jour, ou mois, ou année entre les appels.

Bien sûr, cela ne résout pas votre problème. Allons-y maintenant. Vous essayez clairement d'ajouter un mois à now, alors pourquoi ne pas

DateTime dtmNextPayment = now.AddMonths(1); 

Il est très important de noter que now.AddMonths(1) ne mute pas now; C'est pourquoi vous devez l'affecter à une nouvelle instance de DateTime.

Ensuite, la version originale de votre poste avait

DateTime dtmNextPayment = Convert.ToDateTime(DateTime.Now.AddMonths(1).Month.ToString() + "/" + DateTime.Now.Day.ToString() + "/" + DateTime.Now.Year.ToString()); 

Lorsque DateTime.Now est de 1 Décembre 2011, cela produira

new DateTime(2011, 1, 1); 

dont je doute est ce que vous avez l'intention. Voyez-vous pourquoi?

Votre tentative de modifier ce résultat en

new DateTime(2012, 2, 1) 

lorsque la date est le 1er Janvier 2011. Je doute que ce que vous avez l'intention que la plupart des entreprises ne facturent pas un mois et un an à l'avance. Arrêtez-vous et réfléchissez une seconde, s'il vous plaît.

En outre, vous obtiendrez une exécution, par exemple, si le jour est le 31 janvier 2011 car il n'y a pas de 31 février 2011 (ou le 31 février 2012) d'ailleurs. C'est pourquoi vous obtenez l'exception que vous obtenez maintenant. Lancez votre code demain (1er février 2011), et ce sera "bien". Enfin, ne faites pas ce que vous faites parce qu'il y a des problèmes de culture sérieux. Les formats de toutes les cultures ne correspondent pas à la façon dont vous essayez de les formater.

Moral: DateTime a des méthodes intégrées qui ont déjà été testées et évitent tous ces problèmes. Utilise les. Chaque fois que vous essayez de faire de la logique sur presque n'importe quel objet en convertissant des parties de celui-ci en une chaîne et en convertissant en retour vous invoquez une mauvaise odeur de code.

+1

L'OP ajoute un mois et un an;) faites défiler .... –

+1

@Caspar, c'est un montage furtif, il n'était pas là avant. Probablement, c'est une réponse ratée à cette critique. –

+0

@Caspar Kleijne: C'était catégoriquement pas là avant. L'OP a édité son post, et a juste aggravé le problème. – jason

3

Il suffit de faire ceci:

DateTime dtmNextPayment = DateTime.Now.AddMonths(1); 

pas besoin de créer une chaîne pour analyser juste retour à un objet DateTime.

0

Pourquoi ne pas utiliser: DateTime dtmNextPayment = DateTime.Now.AddMonths(1);?

0

Essayez celui-ci:

DateTime dtmNextPayment = DateTime.Now.AddDays(1).AddMonths(1).AddYears(1); 

vous obtenez ici l'heure actuelle et ajouter à un jour et un mois et un an.