Convert dd/mm/yyyy string to yyyy-dd-mm DateTime in c# - c#

How do I convert 13/05/2019 (dd/mm/yyyy) string to 2019-13-05 (YYYY-dd-mm) DateTime Datatype in c#,sql sever Expects YYYY-dd-mm format datatype
string dateTime = "05/13/2019";
if (animalAdoption.AdoptionId != 0)
{
AnimalsAndBirdsAdoption animalsAndBirdsAdoption = new AnimalsAndBirdsAdoption()
{
AnimalsAndBirdsId = animalAdoption.AnimalId,
DonarDetailsId = userId,
Term = model.Term,
PeriodOfAdoption = dateTime,
isActive = true,
Amount = animalAdoption.amount
};
if (context.AnimalsAndBirdsAdoptions.Any(e => e.Id == animalAdoption.AdoptionId))
{
context.AnimalsAndBirdsAdoptions.Attach(animalsAndBirdsAdoption);
}
else
{
context.AnimalsAndBirdsAdoptions.Add(animalsAndBirdsAdoption);
}
}
this out-put I get

You can do it simply using below example with using your required format:
string dateTime = "05/13/2019";
CultureInfo provider = CultureInfo.InvariantCulture;
// It throws Argument null exception
DateTime dateTime10 = DateTime.ParseExact(dateTime, "yyyy/dd/mm", provider);

string dateTime = "13/05/2019";
var splittedDateTime = dateTime.Split('/');
DateTime myDate = new DateTime(int.Parse(splittedDateTime[2]), int.Parse(splittedDateTime[1]), int.Parse(splittedDateTime[0]));

To convert a UK date string to a DateTime
public DateTime? ToDateTime(string text)
{
DateTime? returnValue = null;
System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("en-GB");
DateTime d = new DateTime();
if(DateTime.TryParse(text, cultureInfo, System.Globalization.DateTimeStyles.None, out d))
{
returnValue = d;
}
return returnValue;
}
To convert a DateTime to string yyyy-MM-dd:
public string ToBigEndianString(DateTime? date)
{
string returnValue = null;
if(date != null)
{
returnValue = date.Value.ToString("yyyy-MM-dd");
}
return returnValue;
}
Then you can put them together:
public string ToBigEndianString(string ukDate)
{
DateTime? d = ToDateTime(ukDate);
return ToBigEndianString(d);
}
But you could pass in a DateTime to a SQL stored procedure.
https://learn.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlparametercollection.addwithvalue?view=netframework-4.8

Change the datatype of PeriodOfAdoption to Type System.DateTime
and then you can initialise the property using the DateTime constructor which has many overloads.
If your string format is always in the form yyyy-dd-mm based on: '2019-13-05'
you can extract the year the month and the day, by perhaps using .Split('-') string function or if its the format: '2019/13/05' you can split on '/' e.g. .Split('/').
Then you can create your DateTime object using the constructor like so (you can view them here https://learn.microsoft.com/en-us/dotnet/api/system.datetime.-ctor?view=netframework-4.8):
constructor:
public DateTime (int year, int month, int day);
initialisation:
PeriodOfAdoption = new DateTime(2019, 5, 13)
so putting it together:
var dateTime = '2019/13/05';
var dateParts = dateTime.Split('/');
PeriodOfAdoption = new DateTime(Int32.parse(dateParts[0]), Int32.parse(dateParts[1]), Int32.parse(dateParts[2]));
If you need a string in the c# side, this is very simple in C# and there are many examples online

Related

Convert string to DateTime using special format

How can I convert this string to a DateTime:
string t = "2017-02-20 13h24m18s";
The format is: XXXX-XX-XX XXhXXmXXs
You could use DateTime.TryParseExact to parse the string using a specific format:
string t = "2017-02-20 13h24m18s";
if(DateTime.TryParseExact(t, #"yyyy-MM-dd HH\hmm\mss\s", CultureInfo.InvariantCulture,
DateTimeStyles.None, out var dt))
{
// parsed successfully into dt
}
Just be sure to escape 13h as HH\h, 24m as mm\m and 18s as ss\s.
You can replace values easily before converting
static public DateTime todate(string t)
{
t = t.Replace("h", ":");
t = t.Replace("m", ":");
t = t.Replace("s", "");
return DateTime.Parse(t);
}
now use
string test = "2017-02-20 13h2m18s";
DateTime a = todate(test);

Unable to get date in proper format when days are less than 12 FROM EXCEL in C#

I am new to c# . When i am trying to import excel sheet using the following code :
try
{
DateTime date = DateTime.FromOADate(w.Cells[i, index[j]].value2);
string str = date.ToString("d-M-yyyy");
dRow[j] = Convert.ToDateTime(str, ci);
}
catch (Exception)
{
try
{
String ss1 = (String)w.Cells[i, index[j]].value2;
if (ss1 == null || ss1.Equals("NIL") || ss1.Equals("."))
{
dRow[j] = DBNull.Value;
}
else if (ss1 != null)
{
DateTime dat = Convert.ToDateTime(ss1);
ss1 = dat.ToString(ci.NumberFormat);
dRow[j] = Convert.ToDateTime(ss1,null);
}
else
{
dRow[j] = DBNull.Value;
}
}
catch (Exception ex1)
{
try
{
String ss2 = (String)w.Cells[i, index[j]].value2;
if (ss2 != null)
{
String ss2_t = ss2.Trim();
DateTime da = DateTime.ParseExact(ss2_t, "d-M-yyyy", null);
dRow[j] = da;
}
else
{
dRow[j] = DBNull.Value;
}
}
catch (Exception ex2)
{
try
{
String ss3 = (String)w.Cells[i, index[j]].value2;
if (ss3 != null)
{
String ss3_t = ss3.Trim();
DateTime da1 = DateTime.ParseExact(ss3, "d-M-yyyy", CultureInfo.InvariantCulture);
dRow[j] = da1;
}
else
{
dRow[j] = DBNull.Value;
}
}
catch (Exception)
{
dRow[j] = DBNull.Value;
}
}
}
Everything works fine untill date has day value less than 12. For example if DATE is 23-07-2013 it works fine . but if DATE is 7-5-2013 then DateTime.FromOADate() convert it into 5-July-2013 . I am totally stuck. Please help me as soon as possible.
If you mean the difficulty is with your str variable then use this format:
string str = date.ToString("dd-mm-yyyy");
Update
The argument passed to DateTime.FromOADate() is a double which is obviously not format sensitive. So I'm not exactly sure why you'd need to convert it to a string and then back to a date. Is it possible that dRow[j] = date is all you need?
If the returned valued of FromOADate() is incorrect then you need to return to your source data, ie Excel. You would need to adjust the format settings there or, if that data was imported, run a small VBA macro to convert the values yourself.
I'm not sure where in the code you are seeing the "d-M-yyyy" v. "M-d-yyy" difference. If you are looking at your dRow[j] variable then this will abide by your defined CultureInfo, presumably the ci variable.
Below is some code that shows three ways of managing date string conversions, the first two manipulate the CultureInfo, the third is pure manual string parsing.
Have a play to see if any of these suit your needs, but I still return to my original question of "do you need to go 'date - string - date' at all"?
DateTime date = DateTime.FromOADate(42491);
string str = date.ToString("d-M-yyyy");
Console.WriteLine(str);
//CultureInfos
CultureInfo ciGB = new CultureInfo("en-GB", false);
CultureInfo ciUS = new CultureInfo("en-US", false);
//ToDateTime version
DateTime dateGB = Convert.ToDateTime(str, ciGB);
DateTime dateUS = Convert.ToDateTime(str, ciUS);
Console.WriteLine("ToDateTime: GB = {0}, US = {1}", dateGB, dateUS);
//ParseExact version
DateTime parsedGB = DateTime.ParseExact(str,"d-M-yyyy", ciGB);
DateTime parsedUS = DateTime.ParseExact(str, "M-d-yyyy", ciUS);
Console.WriteLine("ParseExact: GB = {0}, US = {1}", parsedGB, parsedUS);
//Manual parsing
var parts = str.Split('-');
int item1 = int.Parse(parts[0]);
int item2 = int.Parse(parts[1]);
int item3 = int.Parse(parts[2]);
DateTime manualGB = new DateTime(item3, item2, item1);
DateTime manualUS = new DateTime(item3, item1, item2);
Console.WriteLine("Manual: GB = {0}, US = {1}", manualGB, manualUS);

Convert string to DateTime Format - wrong format

I really cannot make sense of why this does not want to work. I get an exception:
String was not recognized as a valid DateTime.
I am reading the string date from a file and looks like this 2/27/2014 10:10:55
This method receives the filename and extrapolates the data I need (latitude, longitude, date)
public void ReadCsvFile(string filename)
{
var reader = new StreamReader(File.OpenRead(filename));
gpsDataList = new List<GpsFileClass>();
while(!reader.EndOfStream){
var line = reader.ReadLine();
var values = line.Split(',');
if(values[2].Contains("A")){
values[2] = values[2].Substring(0,values[2].IndexOf("A"));
values[2].Replace("\"", "");
values[2] = values[2].Trim();
}
if(values[2].Contains("P")){
values[2] = values[2].Substring(0, values[2].IndexOf("P"));
values[2].Replace("\"", "");
values[2] = values[2].Trim();
}
gpsDataList.Add(new GpsFileClass(Convert.ToDouble(values[0]), Convert.ToDouble(values[1]), Convert.ToString(values[2])));
}
}
Once the I have the file data in a List<> I want to do some date comparisons and calculations. But first; I try to convert the string data containing date information to datetime like this:
public void SaveFrameGpsCoordinate()
{
int listSize = gpsDataList.Count;
DateTimeFormatInfo dateTimeFormatInfo = new DateTimeFormatInfo();
dateTimeFormatInfo.ShortDatePattern = "dd-MM-yyyy HH:mm:ss";
dateTimeFormatInfo.DateSeparator = "/";
//DateTime tempDateA = DateTime.ParseExact(gpsDataList[0].timeCaptured, "dd/MM/yyyy HH:mm:ss",null);
//DateTime tempDateB = DateTime.ParseExact(gpsDataList[lastRecordData].timeCaptured, "dd/MM/yyyy HH:mm:ss", null);
DateTime tempDateA = Convert.ToDateTime(gpsDataList[0].timeCaptured.Replace("\"", ""), System.Globalization.CultureInfo.GetCultureInfo("hi-IN").DateTimeFormat);
DateTime tempDateB = Convert.ToDateTime(gpsDataList[lastRecordData].timeCaptured.Replace("\"", ""), System.Globalization.CultureInfo.GetCultureInfo("hi-IN").DateTimeFormat);
}
As you can see even ParseExact throws the same exception, I tried it (hence commented it out).
There are a lot solutions for this kind of problem but non seem to work on mine. I get that DateTime by default uses en-US calture. But When I even when I change the culture to "af-ZA" I get the same exception.
Please help.
I don't believe it; The variable that holds the size of the List<> was going out of range (check line 3 of code below) but for some reason it did not throw an "out of range exception".
public void SaveFrameGpsCoordinate()
{
int listSize = gpsDataList.Count - 1;
DateTimeFormatInfo dateTimeFormatInfo = new DateTimeFormatInfo();
dateTimeFormatInfo.ShortDatePattern = "dd-MM-yyyy HH:mm:ss";
dateTimeFormatInfo.DateSeparator = "/";
//DateTime tempDateA = DateTime.ParseExact(gpsDataList[0].timeCaptured, "dd/MM/yyyy HH:mm:ss",null);
//DateTime tempDateB = DateTime.ParseExact(gpsDataList[lastRecordData].timeCaptured, "dd/MM/yyyy HH:mm:ss", null);
DateTime tempDateA = Convert.ToDateTime(gpsDataList[0].timeCaptured.Replace("\"", ""), System.Globalization.CultureInfo.GetCultureInfo("hi-IN").DateTimeFormat);
DateTime tempDateB = Convert.ToDateTime(gpsDataList[lastRecordData].timeCaptured.Replace("\"", ""), System.Globalization.CultureInfo.GetCultureInfo("hi-IN").DateTimeFormat);
}
You can use the ParseExact method
var dateTime = DateTime.ParseExact("2/27/2014 10:10:55",
"M/d/yyyy h:m:s", CultureInfo.InvariantCulture);
'dd' expects a 2 digit date. You probably want to use 'd' instead.
Similarly 'MM' expects a 2 digit month - again you probably want to use 'M' instead.
Source: http://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx

Converting String to Datetime of string Type "12-07-2012"

I am trying to convert an array of Strings containing Dates in string format
private string[] ex = new string[]{
"29-06-2017","29-12-2016","30-06-2016","31-12-2015","25-06-2015","24-12-2014","26-06-2014","26-12-2013"};
and I want to cast to decimal array and i used the below code but its not working .
public void load()
{
DateTime[] exDate=Array.ConvertAll(ex, new Converter<string, DateTime>(convertDecimal));
List<DateTime> expiryDate = new List<DateTime>();
expiryDate.AddRange(exDate);
expiryDate.Sort();
_expiryDate=expiryDate;
}
public static DateTime convertDecimal(string strgDate)
{
return DateTime.Parse(strgDate);
}
The error I am getting is:
"String was not recognized as a valid DateTime."
var dates = ex.Select(d => DateTime.ParseExact(d, "dd-MM-yyyy", CultureInfo.InvariantCulture))
.ToList();
Try Converting like this:
public static DateTime convertDecimal(string strgDate)
{
return DateTime.ParseExact(strgDate, "yyyy-MM-dd",
System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None));
}

DateTime class common error displayed again

I run into a little common problem with datetime class that I have no idea how to resolve.
I don't know what the error is but I see the troubleshooting tips are displayed as
When converting a string to DateTime, parse the string to take the date before putting each variable into the DateTime object. Make sure your method arguments are in the right format.
Here is the piece of code I extract from my program,
public IEnumerable<CONTACT_INFO> GetContactInfo(string tableName)
{
DataTable dt = GetUserInfo(tableName);
List<CONTACT_INFO> lst = new List<CONTACT_INFO>();
foreach (DataRow row in dt.Rows)
{
string sDate = "";
if(!string.IsNullOrEmpty(row["birthday"].ToString()))
{
sDate = row["birthday"].ToString();
}
string format = "yyyyMMdd";
System.Globalization.CultureInfo provider =CultureInfo.InvariantCulture;
string datetime = DateTime.Now.ToShortDateString();
if (!string.IsNullOrEmpty(sDate))
{
datetime = DateTime.ParseExact(sDate, format, provider).ToShortDateString();
}
if (row["companyname"].ToString().CompareTo("companylogo") != 0)
{
string profile_time = row["profile_timestamp"].ToString();
if (!string.IsNullOrEmpty(profile_time))
{
CSTimeZone time = new CSTimeZone();
profile_time = time.FromUnix(Convert.ToDouble(profile_time)).ToShortDateString()+" "+
time.FromUnix(Convert.ToDouble(profile_time)).ToLongTimeString();
}
string lastUseNetTime = row["last_used_networktime"].ToString();
if (!string.IsNullOrEmpty(lastUseNetTime))
{
CSTimeZone time = new CSTimeZone();
double sec = Convert.ToDouble(lastUseNetTime) * 60;
lastUseNetTime = time.FromUnix(Convert.ToDouble(sec)).ToShortDateString() + " " +
time.FromUnix(Convert.ToDouble(sec)).ToLongTimeString();
}
string lastOnlineTime = row["lastonline_timestamp"].ToString();
if (!string.IsNullOrEmpty(lastOnlineTime))
{
CSTimeZone time = new CSTimeZone();
lastOnlineTime = time.FromUnix(Convert.ToDouble(lastOnlineTime)).ToShortDateString() + " " +
time.FromUnix(Convert.ToDouble(lastOnlineTime)).ToLongTimeString();
}
lst.Add(new CONTACT_INFO()
{
gender=Convert.ToInt32(row["gender"].ToString()),
timezone=row["timezone"].ToString(),
fullName = row["fullname"].ToString(),
profile_timestamp = profile_time,
last_used_networktime = lastUseNetTime,
lastonline_timestamp = lastOnlineTime,
birthday = string.IsNullOrEmpty(sDate) ? "" : datetime
});
}
}
return lst;
}
The function FromUnix is written as
public DateTime FromUnix(double seconds)
{
DateTime datetime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).ToLocalTime();
return datetime.AddSeconds(seconds);
}
I am pretty sure this is a parsing problem
The following line would throw exceptions if the value of sDate is not in the defined format of yyyyMMdd
datetime = DateTime.ParseExact(sDate, format, provider).ToShortDateString();
I would first use TryParseExact instead of a simple Parse since you do not seem to be using try/catch clauses. It might be a good idea to use the debugger to see exactly where your program is failing.
Other example of potential failures in your code are
double sec = Convert.ToDouble(lastUseNetTime) * 60;
Use double.tryParse
Convert.ToInt32(row["gender"].ToString()
If gender turns out not to be a number another exception will be thrown
etc...

Categories