Je suis absolument nouveau en C # (je viens de Java) et j'ai un problème très stupide
Je dois initialiser certains champs DateTime dans un objet mais j'ai des problèmes pour le faire.
En particulier, j'essaie d'initialiser ces domaines de cette manière:
mySmallVuln.Published = '1998,04,30';
mySmallVuln.LastUpdated = '2007,11,05';
Mais Visual Studio le signe comme une erreur
Trop de caractères dans le caractère littéral
Qu'est-ce que je rate? Comment le résoudre?
mySmallVuln.Published = new DateTime(1998,04,30);
Ou peut-être comme ça
var date = DateTime.MinValue;
if (DateTime.TryParse("1998/04/30", out date))
{
//Sucess...
mySmallVuln.Published = date;
}
DateTime d = default(DateTime);
Le mot-clé par défaut fonctionne également pour tous les types de données!
Les deux sont les même....
1
mySmallVuln.Published = new DateTime(1998,04,30,0,0,0);
mySmallVuln.LastUpdated = new DateTime(2007,11,05,0,0,0);
2
mySmallVuln.Published = new DateTime(1998,04,30);
mySmallVuln.LastUpdated = new DateTime(2007,11,05);
dans la première méthode, vous pouvez affecter respectivement heure minute et seconde en paramètre aux trois derniers paramètres.
Pour initialiser une valeur DateTime
, vous pouvez utiliser le constructeur DateTime
:
mySmallVuln.Published = new DateTime(1998,04,30);
Vous utilisez un caractère littéral ''
qui ne peut contenir qu'un seul caractère. Si vous souhaitez utiliser une chaîne littérale, utilisez ""
au lieu.
C # ne prend pas en charge les littéraux DateTime
- par opposition à VB.NET (#4/30/1998#
).
En dehors de cela, une chaîne n'est pas un DateTime
. Si vous avez une chaîne, vous devez d'abord l'analyser en DateTime
:
string published = "1998,04,30";
DateTime dtPublished = DateTime.ParseExact(published, "yyyy,MM,dd", CultureInfo.InvariantCulture);
mySmallVuln.Published = dtPublished;
ou vous pouvez créer un DateTime
via le constructeur:
DateTime dtPublished = new DateTime(1998, 04, 30);
ou, puisque votre chaîne contient l'année, le mois et le jour sous forme de chaînes, utilisez String.Split
et int.Parse
:
string[] tokens = published.Split(',');
if (tokens.Length == 3 && tokens.All(t => t.All(Char.IsDigit)))
{
int year = int.Parse(tokens[0]);
int month = int.Parse(tokens[1]);
int day = int.Parse(tokens[2]);
dtPublished = new DateTime(year, month, day);
}
Si vous recherchez l'erreur que vous obtenez, vous allez trouver :
En effet, en C #, les guillemets simples ('') désignent (ou encapsulent) un seul caractère, tandis que les guillemets doubles ("") sont utilisés pour une chaîne de caractères.
Vous allez donc essayer:
DateTime foo = "2014,02,20";
Ce qui donne:
Impossible de convertir implicitement le type 'chaîne' en 'System.DateTime'
Maintenant, si vous recherchez cette erreur , vous allez trouver :
int StartYear = 2012;
int StartMonth = 06;
int StartDay = 15;
DateTime dt = new DateTime(StartYear, StartMonth, StartDay);
Malheureusement, C # ne prend pas en charge les littéraux Date. Vous devez changer votre code et instancier les objets DateTime en utilisant new DateTime(..)
, comme Thomas l'a illustré dans sa réponse.
Juste pour développer ce sujet: VB.NET prend en charge les littéraux de date en utilisant le caractère # (ironiquement). Voici comment les exprimer, à partir de la documentation MSDN :
Dim d As Date
d = # 8/23/1970 3:45:39AM #
d = # 8/23/1970 # ' Date value: 8/23/1970 12:00:00AM.
d = # 3:45:39AM # ' Date value: 1/1/1 3:45:39AM.
d = # 3:45:39 # ' Date value: 1/1/1 3:45:39AM.
d = # 13:45:39 # ' Date value: 1/1/1 1:45:39PM.
d = # 1AM # ' Date value: 1/1/1 1:00:00AM.
d = # 13:45:39PM # ' This date value is not valid.
utilisez ceci
// année mois jour
mySmallVuln.Published=new DateTime(2011,11,4);
Vous pouvez soit analyser une chaîne, comme la vôtre. Ou vous pouvez instancier un objet DateTime avec des nombres.
DateTime date1 = new DateTime(1998, 04, 30);
DateTime date2 = DateTime.ParseExact("1998,04,30", "yyyy,MM,dd", CultureInfo.InvariantCulture);