string not recognized as a valid datetime in c# ERROR - c#

Even after using DateTime.ParseExact I am getting error as
string not recognized as a valid datetime in c#
Below is my code
string strIDODDate = DateTime.ParseExact(ObjIp.ID_ODchangeDate, "dd-MM-yyyy hh:mm:ss", CultureInfo.InvariantCulture).ToString("dd-MM-yyyy");
Here is full set of code
string strRFCsDate = DateTime.Now.ToString("dd-MM-yyyy", CultureInfo.InvariantCulture);
//string strRFCsDate1 = DateTime.ParseExact("25-09-2019 00:00:00.000", "dd-MM-yyyy hh:mm:ss.fff", CultureInfo.InvariantCulture)
// .ToString("dd-MM-yyyy");
if (string.IsNullOrEmpty(ObjIp.ID_ODchangeDate))
{
Tobj.ID_ODchangeDate = strRFCsDate;
}
else
{
//Tobj.ID_ODchangeDate = Convert.ToString(ObjIp.ID_ODchangeDate);
string strIDODDate = DateTime.ParseExact(ObjIp.ID_ODchangeDate, "dd-MM-yyyy hh:mm:ss", CultureInfo.InvariantCulture).ToString("dd-MM-yyyy");
Tobj.ID_ODchangeDate = strIDODDate;
}
update
After debugging, I found out that the format which was coming was with exception was below
10/28/2021 5:34:35 AM : 10/7/2019 12:00:00 AM 10/28/2021 5:34:35 AM : Error : Dumping into Table Process : String was not recognized as a valid DateTime. at System.DateTimeParse.ParseExact(String s, String format, DateTimeFormatInfo dtfi, DateTimeStyles style)

Based on your comments and update:
ObjIp.ID_ODchangeDate was coming in 10/7/2019 12:00:00 AM
You are telling ParseExact a your format is "dd-MM-yyyy hh:mm:ss tt" this means a few things:
Your day will ALWAYS have 2 digits, meaning a leading 0 (you have 10)
Your month will ALWAYS have 2 digits, meaning a leading 0 (you have 7)
Your Year will have 4 digits (you have 2019)
Your separator will be '-' (you have /)
You will be using the 12 hour clock, including seconds (you have 12:00:00 AM)
The example you gave is not true for 2 and 4 of my list. I expect it won't be true for 1 for the first 9 days of any month, because of this you need to specify a format that doesn't include leading 0s and uses the correct date separators. The format you want is "d/M/yyyy hh:mm:ss tt" this format tells the parser:
The day will have 2 digits if it needs them, no guaranteed leading 0
The month will have 2 digits if it needs them, no guaranteed leading 0
The year will have 4 digits
The separator will be '/'
The time will be using the 12 hour clock, including seconds
That means the code will look like this. I pulled the formats out into variables for readability, and turned object.property into a variable to make it run simply in fiddle.
string ObjIp_ID_ODchangeDate = "10/7/2019 12:00:00 AM";
string dtFormatIn = "d/M/yyyy hh:mm:ss tt";
string dFormatOut = "dd-MM-yyyy";
string strIDODDate = DateTime.ParseExact(ObjIp_ID_ODchangeDate, dtFormatIn, CultureInfo.InvariantCulture).ToString(dFormatOut);
Console.WriteLine(strIDODDate);
As you can see, this works for your case.

Unclear from your question, so I'm assuming your incoming date time string is something like 25-09-19 00:00:00.000
var inDateTime = "25-09-19 00:00:00.000";
string parsedDateTime = DateTime.ParseExact(inDateTime, "dd-MM-yy hh:mm:ss.fff", CultureInfo.InvariantCulture).ToString("dd-MM-yyyy");
Console.WriteLine(parsedDateTime);
Output
25-09-2019
UPDATE:
Please review: https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings
These are the date and time format strings for parsing date times.
It's still unclear if your value is October 7 or July 10... Assuming July 10:
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
var inDateTime = "10/7/2019 12:00:00 AM";
string parsedDateTime = DateTime.ParseExact(inDateTime, "dd/M/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture).ToString("dd-MM-yyyy");
Console.WriteLine(parsedDateTime);
}
}
Output
10-07-2019
See:
https://dotnetfiddle.net/2YMb82

Related

Convert date string to DateTime format

I have the date string like 03/10/1999 where the format is dd/MM/yyyy (pt-BR format).
And I need to convert this date for a SQL-like format yyyy-MM-dd HH:mm:ss.fff.
I tried to use Parse and ParseExact functions, but no success so far. I will let my results below...
Using Parse
var BrazilianDate = "03/10/1999";
var Parse = DateTime.Parse(BrazilianDate, new CultureInfo("pt-BR"));
Console.WriteLine("Parsed date: " + Parse);
Output: Parsed date: 10/3/1999 12:00:00 AM
No hyphens or milliseconds...
Using ParseExact
var BrazilianDate = "03/10/1999";
var ParseExact = DateTime.ParseExact(BrazilianDate, "yyyy-MM-dd HH:mm:ss.fff", new CultureInfo("pt-BR"));
Console.WriteLine(ParseExact);
output:
Run-time exception (line -1): String was not recognized as a valid
DateTime.
Stack Trace:
[System.FormatException: String was not recognized as a valid
DateTime.] at System.DateTimeParse.ParseExact(String s, String
format, DateTimeFormatInfo dtfi, DateTimeStyles style) at
System.DateTime.ParseExact(String s, String format, IFormatProvider
provider) at Program.Main()
You need to format your output with the correct format string like this:
Console.WriteLine("Parsed date: " + Parse.ToString("yyyy-MM-dd HH:mm:ss.fff"));
//Parsed date: 1999-10-03 00:00:00.000
If you don't specify a format, .NET picks whatever it thinks is the right one (which it often isn't when you're not in the US).
You also need to strictly separate between the DateTime value and its representation in string form. No matter how you format it, the value itself will stay the same.
The format string you use in the parse method represents the format of the input string.
A DateTime does not have a display format, in fact it's a numeric value representing the number of ticks since a specific Epoch.
From official documentation:
Time values are measured in 100-nanosecond units called ticks. A particular date is the number of ticks since 12:00 midnight, January 1, 0001 A.D. (C.E.) in the GregorianCalendar calendar. The number excludes ticks that would be added by leap seconds. For example, a ticks value of 31241376000000000L represents the date Friday, January 01, 0100 12:00:00 midnight.
When parsing strings, I find it's best to either use ParseExact or TryParseExact. To print our the string representation of the DateTime value, use the overload of ToString that takes in a string that represent the format you want to display.
var BrazilianDateString = "03/10/1999";
var DateTimeValue = DateTime.ParseExact(BrazilianDate, "dd/MM/yyyy", CultureInfo.InvariantCulture);
Console.WriteLine(DateTimeValue.ToString("yyyy-MM-dd HH:mm:ss.fff");
This code is working for me:
DateTime dt = new DateTime();
string x = "03/10/1999 22:10:10";
dt = DateTime.Parse(x);
Console.WriteLine(dt.ToShortDateString());
Console.WriteLine(dt.ToShortTimeString());
Console.ReadLine();
Console output:
03/10/1999
22:10
Don't use that CultureInfo, DateTime can understand spanish-brazilian dates on its own

ParseExact DateTime error

I have a list of DateTime as strings: dd.MM.yyyy H:mm:ss (The time is 24 hours format but the hour is single digit: 6 instead of 06)
14.12.2016 6:20:21
15.12.2016 8:30:00
16.12.2016 12:30:00
17.12.2016 14:33:00
18.12.2016 18:10:00
I am trying to parse exact the string values as a DateTime object like this:
DateTime.ParseExact(dt, "dd.MM.yyyy H:mm:ss", CultureInfo.InvariantCulture) (dt is the string value from the list)
The problem is I get an error saying the string is not a valid DateTime ...
With the current format, the first and second values in the list work fine, when it get's to the third 'boooom' I get the error.
Am I missing something in my format?
Use the overload of DateTime.ParseExact that accepts an array of valid formats:
string[] formats = { "dd.MM.yyyy H:mm:ss", "dd.MM.yyyy HH:mm:ss" };
var result = DateTime.ParseExact(dt, formats, CultureInfo.InvariantCulture, 0);
UPDATE: As others have noted, H should match both one-digit and two-digit hours, so something else is going on. The following code runs successfully on my system (.NET 4.5.2):
string dt = "16.12.2016 12:30:00";
var result = DateTime.ParseExact(dt, "dd.MM.yyyy H:mm:ss", CultureInfo.InvariantCulture);
I had to parse exact the using Hour, Minute, and Second then use the ToString method to convert to a Month, day, and year format
$myStringDate=[Datetime]::ParseExact($item.myDateObject,'MM/dd/yyyy H:mm:ss',$null).ToString('MM/dd/yyyy')

Formatting Date and Datetime with SSIS Script Transformation

I have a flat file containing dates like this: 07/07/2003 12:18:20 PM.
The SSIS Transformation Output Column is set to database timestamp [DT_DBTIMESTAMP].
I have the following method:
public string DbDateTime(string input)
{
return DateTime.ParseExact(input, "M/d/yyyy h:mm:ss tt",
CultureInfo.InvariantCulture).ToString();
}
I need an output like this to the database:
2003-07-07 12:18:00.000
However, I keep getting an error:
String was not recognized as a valid DateTime.
The output is set like this:
Row.OuputDateTimeColumn =
Convert.ToDateTime(DbDateTime(Row.InputDateTimeColumn));
I prefer not to use a Derived Column for the conversion.
Problem 1: You are providing invalid custom format for both Month and Date feilds.
you have two fixed digits in your Date String but you are only providing one digit format as below:
"M/d/yyyy h:mm:ss tt"
so you need to Replace this as below:
if your DateString hour format is 00-12
"MM/dd/yyyy hh:mm:ss tt"
if your DateString hour format is 0-12
"MM/dd/yyyy h:mm:ss tt"
Problem 2: You want to return the Date String in custom format of 2003-07-07 12:18:00.000 i assume it is in the format of yyyy-MM-dd h:mm:ss.ffff.
Note: as both Month and Date are same(07) in your example, you need to adjust them accordingly if my assumption is wrong.
so you need to provide the above custom format to the ToString() function in the return statement.
Complete Code:
public string DbDateTime(string input)
{
return DateTime.ParseExact(input, "MM/dd/yyyy h:mm:ss tt",
CultureInfo.InvariantCulture).ToString("yyyy-MM-dd h:mm:ss.fff");
}
Problem 3: while adding the Custom DateFormat to the database you need to first convert it into the DateTime as below:
Row.OuputDateTimeColumn = DateTime.ParseExact(
DbDateTime(Row.InputDateTimeColumn),"yyyy-MM-dd h:mm:ss.fff"
CultureInfo.InvariantCulture);
Your format is wrong. It doesn't match with your input string. Use MM/dd/yyyy h:mm:ss tt format instead. For example;
public string DbDateTime(string input)
{
return DateTime.ParseExact(input,
"MM/dd/yyyy h:mm:ss tt",
CultureInfo.InvariantCulture).
ToString("yyyy-MM-dd h:mm:ss.fff");
}
From DateTime.ParseExact method
Converts the specified string representation of a date and time to its
DateTime equivalent using the specified format and culture-specific
format information. The format of the string representation must match
the specified format exactly.
M is for 1 to 12 but MM is for 01 to 12.
d is for 1 to 31 but dd is for 01 to 31.
Also be carefull about your hour forma. h is for 1 to 12, hh is for 01 to 12. If you want to use 24-hour format, you need to use H or HH formats.
For more informations, take a look;
Custom Date and Time Format Strings

Convert Date Formatting Codes to date

The user is supposed to enter date in format: %m %d %Y
What I need to do is convert the date to: 11 11 2013 ( which is today`s date). I have not worked much with dates. Is there some method that does this conversion out of the box? I looked through DateTime options but couldn't find what I need.
Edit:
From the answers received it seems that it is not very clear what I am asking.
In our software the user can insert dates in format like this:
http://ellislab.com/expressionengine/user-guide/templates/date_variable_formatting.html
I am trying to parse this user input and return the today date. So from the link above:
%m - month - “01” to “12”
%d - day of the month, 2 digits with leading zeros - “01” to “31”
%Y - year, 4 digits - “1999”
I was wondering if there is a method that takes %m %d %Y as an input and returns the corresponding today date in the specified format ( which is 11 11 2013 today). Or at least something close to that.
Hope it is more clear now.
EDIT 2:
After digging a little bit more I found that what I am looking for is an equivalent of C++ strftime in C#.
http://www.cplusplus.com/reference/ctime/strftime/
But for some reason I cannot see an example this to implemented in C#.
You can use DateTime.TryParseExact to parse a string to date and DateTime-ToString to convert it back to string with your desired format:
DateTime parsedDate;
if (DateTime.TryParseExact("11 11 2013", "MM dd yyyy", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out parsedDate))
{
// parsed successfully, parsedDate is initialized
string result = parsedDate.ToString("MM dd yyyy", System.Globalization.CultureInfo.InvariantCulture);
Console.Write(result);
}
My go-tos for DateTime Input and Output:
http://www.dotnetperls.com/datetime-parse for input (parsing)
http://www.csharp-examples.net/string-format-datetime/ for output (formatting)
string dateString = "01 01 1992";
string format = "MM dd yyyy";
DateTime dateTime = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture);
Edit since his edit makes my above answer irrelevant (but will leave there for reference):
From what you're saying, you want to output today's date in a dynamically-defined format?
So if I want to see month, date, year, I say "MM dd YY" and you return it to me?
If so:
DateTime dt = DateTime.Today; // or initialize it as before, with the parsing (but just a regular DateTime dt = DateTime.Parse() or something quite similar)
Then
String formatString = "MM dd YY";
String.Format("{0:"+ formatString+"}", dt);
Your question is still quite unclear, though.
Use ParseExact:
var date = DateTime.ParseExact("9 1 2009", "M d yyyy", CultureInfo.InvariantCulture);

Date and time conversion in C# - DateTime.ParseExact() not working as expected

I have date/time format, for example:
"1-Mar-13 92230"
According to this document and this link the format is as follows:
"d-MMM-yy Hmmss", because:
Day is single digit, 1-30
Month is 3 letter abbreviation, Jan/Mar etc.
Year is 2 digits, eg 12/13
Hour is single digit for 24 hour clock, eg 9, 13 etc. (no 09)
Minute is standard (eg 01, 52)
Second is standard (eg 30, 02)
I'm trying to run the following code in my program, but I keep getting an error of "String was not recognized as a valid DateTime."
string input = "1-Mar-13 92330";
var date = DateTime.ParseExact(input, "d-MMM-yy Hmmss",
System.Globalization.CultureInfo.CurrentCulture);
Please help, I'm not too familiar with DateTime conversions, but I can't see where I've gone wrong here. Thanks!
UPDATE: Is this because time cannot be parsed without colons in between? (eg 1-Mar-13 9:22:30 gets parsed, but i have an external data source that would be impossible to rewrite from Hmmss to H:mm:ss)
You could fix your date:
var parts = "1-Mar-13 92230".Split(' ');
if (parts[1].Length == 5)
{
parts[1] = "0" + parts[1];
}
var newDate = parts[0] + " " + parts[1];
var date = DateTime.ParseExact(newDate, "d-MMM-yy HHmmss", System.Globalization.CultureInfo.CurrentCulture);
From msdn:
If format is a custom format pattern that does not include date or
time separators (such as "yyyyMMdd HHmm"), use the invariant culture
for the provider parameter and the widest form of each custom format
specifier. For example, if you want to specify hours in the format
pattern, specify the wider form, "HH", instead of the narrower form,
"H".
so you can try:
string input = "1-Mar-13 92330";
var date = DateTime.ParseExact(input, "d-MMM-yy Hmmss",
System.Globalization.CultureInfo.InvariantCulture);
Your input string has to be of following format
string input = "1-Mar-13 092330";
If you go back to your link, it says
H 24-hour clock hour (e.g. 19)
Now H is 24 hours, it should be represented with leading 0. If not imagine how would you handle the case of hours greater than 9 i.e which are in double digit.
If not your hour and Minute and Seconds has to be separated.
string input = "1-Mar-13 9 2330";
var date = DateTime.ParseExact(input, "d-MMM-yy H mmss",
System.Globalization.CultureInfo.InvariantCulture);
Your hour min and seconds need to be separated, as they are not getting distinguished.
string input = "1-Mar-13 9 23 30";
var date = DateTime.ParseExact(input, "d-MMM-yy H mm ss", System.Globalization.CultureInfo.CurrentCulture);

Categories

Resources