Cannot parse string to date with tryparse exact - c#

I am reading a string from a log file with a date value like this:
Thu Oct 06 15:38:45 2016
Obviously
DateTime.TryParse()...
will not handle that. So, I tried using
DateTime.TryParseExact()
like this:
string szDateFormat = "ddd MMM yy HH:mm:ss yyyy";
string szTest = "Thu Oct 06 15:38:45 2016";
DateTime dd;
DateTime.TryParse(szTest, out dd);
CultureInfo current = CultureInfo.CurrentCulture;
CultureInfo newculture = new CultureInfo("en-US");
Console.WriteLine(current);
Console.WriteLine(newculture);
Console.WriteLine(String.Format(" Test: {0}", szTest));
Console.WriteLine(String.Format("Format: {0}", szDateFormat));
Console.WriteLine(String.Format(" dd: {0:ddd MMM yy HH:mm:ss yyyy}", dd));
Console.WriteLine("");
DateTime.TryParseExact(szTest, szDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out dd);
Console.WriteLine(String.Format(" Test: {0}", szTest));
Console.WriteLine(String.Format("Format: {0}", szDateFormat));
Console.WriteLine(String.Format(" dd: {0:ddd MMM yy HH:mm:ss yyyy}", dd));
Console.WriteLine("");
And the result is this:
en-US
en-US
Test: Thu Oct 06 15:38:45 2016
Format: ddd MMM yy HH:mm:ss yyyy
dd: Mon Jan 01 00:00:00 0001
Test: Thu Oct 06 15:38:45 2016
Format: ddd MMM yy HH:mm:ss yyyy
dd: Mon Jan 01 00:00:00 0001
In a previous iteration I used
CultureInfo.CurrentCulture
as well with no change.
Any help would be appreciated.
Thanks,
John

You are attempting to parse the numeric day (06) with yy when you should be using dd:
ddd MMM dd HH:mm:ss yyyy

I think this is the problem:
string szDateFormat = "ddd MMM yy HH:mm:ss yyyy";
string szTest = "Thu Oct 06 15:38:45 2016";
the format should be:
ddd MMM dd HH:mm:ss yyyy
if you want to parse:
Thursday 06.10.2016 15:38:45
The third parameter yyshould be dd as it will conflict with the last parameter yyyy. yy is pointing to 2006, but the yyyy refers to 2016. This will create a confusion for the parser.

I think that your date format is incorrect "ddd MMM yy HH:mm:ss yyyy" has to be
"ddd MMM dd HH:mm:ss yyyy"

My two cents:
"dd" is never set, since it is never parsed propery in the first place so " dd: Mon Jan 01 00:00:00 0001" is not really meaningful.
If your input format is always the same, pre-parse it for instance put the last 4 chars - year- in the start of the string)

Related

c# date time parse from Fri Feb 21 23:07:58 +0000 2020

I have the following date
string dateTimeText = #"Fri Feb 21 23:07:58 +0000 2020";
I want to parse it:
DateTime.ParseExact(dateTimeText, "D M dd HH:mm:ss +ssss yyyy", new CultureInfo("en-US"));
this implementation throws exception. Thanks
Well, if +ssss (+0000) stands for TimeZone (so +0000 means GMT) the pattern is
"ddd MMM dd HH:mm:ss zzzz yyyy"
I.E.
string dateTimeText = "Fri Feb 21 23:07:58 +0000 2020";
var result = DateTime.ParseExact(
dateTimeText,
#"ddd MMM dd HH:mm:ss zzzz yyyy",
CultureInfo.GetCultureInfo("en-US"));
In case +ssss and (an corresponding +0000) are fractions of seconds the pattern will be
"ddd MMM dd HH:mm:ss' +'FFFF yyyy"

Convert a specific type of sting in Date Time

I have to convert the below string in DateTime. I have used following code for that but it was not working.
DateTime created = DateTime.ParseExact("Sun Feb 23 2014 00:00:00 GMT+0550", "ddd mmm d yyyy HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
My string to which I have to convert in Date Time is--
Sun Feb 23 2014 00:00:00 GMT+0550
You need uppercase month and 'GMT'zzz
DateTime created = DateTime.ParseExact("Sun Feb 23 2014 00:00:00 GMT+0550"
, "ddd MMM dd yyyy HH:mm:ss 'GMT'zzz"
, System.Globalization.CultureInfo.InvariantCulture);
I would parse this as a DateTimeOffset instead of a DateTime - after all, that's the data you've been given. Assuming it's always specified using GMT+... you can use a format string of "ddd MMM d yyyy HH:mm:ss 'GMT'zzz". In particular, note:
MMM is abbreviated month name, not mmm
'GMT' will always match the letters 'GMT'
zzz is a UTC offset including minutes. It would be formatted with a colon, but apparently it's permissive enough without the colon being specified.
Sample code:
using System;
using System.Globalization;
class Test
{
static void Main()
{
var dto = DateTimeOffset.ParseExact
("Sun Feb 23 2014 00:00:00 GMT+0550",
"ddd MMM d yyyy HH:mm:ss 'GMT'zzz",
CultureInfo.InvariantCulture);
Console.WriteLine(dto); // 23/02/2014 00:00:00 +05:50
}
}
Try This:
DateTime created = DateTime.ParseExact("Sun Feb 23 2014 00:00:00 GMT+0550",
"ddd MMM d yyyy HH:mm:ss 'GMT'zzz",
System.Globalization.CultureInfo.InvariantCulture);

Getting date format in C# identical to javascript date function

I'm assigning the date to the variable in javascript.
var myDate = new Date(y, m, 1)
So I get the date in myDate as: Fri Mar 01 2013 00:00:00 GMT+0530 (India Standard Time)
I need to format the date string in C sharp in the same manner.
I tried something like this:
string.Format("{0:yyyy-MM-dd hh:mm:ss} GMT {1}", dt.ToLocalTime(), dt.ToLocalTime().ToString("%K"))
It gives me: "2013-03-12 01:31:49 GMT +05:30"
So it's not the exact format I want. Any help...
This should work
System.DateTime.Now.ToString("ddd MMM dd yyyy HH:mm:ss \"GMT\"K")
returns "Tue Mar 12 2013 14:01:38 GMT+05:30"
What you want is the following which will give you exactly the same as JavaScript!
string.Format("{0:ddd MMM dd yyyy hh:mm:ss \"GMT\"K} ({1})", dt.ToLocalTime(), TimeZoneInfo.Local.StandardName)
There's probably a more proper way, but in this case the initial part of your format string is just off:
ddd MMM dd yyyy
string.Format("{0:ddd MMM dd yyyy hh:mm:ss} GMT {1}", dt.ToLocalTime(), dt.ToLocalTime().ToString("%K"))
string.Format("{0:ddd MMM dd yyyy hh:mm:ss} GMT {1}", dt.ToLocalTime(), dt.ToLocalTime().ToString("%K"))
You format string is wrong.
Should be something like:
"{0:ddd MMM dd yyyy hh:mm:ss} GMT{1}"
Why not just use
dt.ToString("ddd MMM dd yyyy HH':'mm':'ss 'GMT'K");
Should give you
Fri Mar 01 2013 00:00:00 GMT+0530
Try This Code>>
DateTime dt = DateTime.Now;
String.Format("{0:dd-MM-yyyy}", dt);

C# DateTime to "YYYYMMDDHHMMSS" format

I want to convert a C# DateTime to "YYYYMMDDHHMMSS" format. But I don't find a built in method to get this format? Any comments?
DateTime.Now.ToString("yyyyMMddHHmmss"); // case sensitive
This site has great examples check it out
// create date time 2008-03-09 16:05:07.123
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);
String.Format("{0:y yy yyy yyyy}", dt); // "8 08 008 2008" year
String.Format("{0:M MM MMM MMMM}", dt); // "3 03 Mar March" month
String.Format("{0:d dd ddd dddd}", dt); // "9 09 Sun Sunday" day
String.Format("{0:h hh H HH}", dt); // "4 04 16 16" hour 12/24
String.Format("{0:m mm}", dt); // "5 05" minute
String.Format("{0:s ss}", dt); // "7 07" second
String.Format("{0:f ff fff ffff}", dt); // "1 12 123 1230" sec.fraction
String.Format("{0:F FF FFF FFFF}", dt); // "1 12 123 123" without zeroes
String.Format("{0:t tt}", dt); // "P PM" A.M. or P.M.
String.Format("{0:z zz zzz}", dt); // "-6 -06 -06:00" time zone
// month/day numbers without/with leading zeroes
String.Format("{0:M/d/yyyy}", dt); // "3/9/2008"
String.Format("{0:MM/dd/yyyy}", dt); // "03/09/2008"
// day/month names
String.Format("{0:ddd, MMM d, yyyy}", dt); // "Sun, Mar 9, 2008"
String.Format("{0:dddd, MMMM d, yyyy}", dt); // "Sunday, March 9, 2008"
// two/four digit year
String.Format("{0:MM/dd/yy}", dt); // "03/09/08"
String.Format("{0:MM/dd/yyyy}", dt); // "03/09/2008"
Standard DateTime Formatting
String.Format("{0:t}", dt); // "4:05 PM" ShortTime
String.Format("{0:d}", dt); // "3/9/2008" ShortDate
String.Format("{0:T}", dt); // "4:05:07 PM" LongTime
String.Format("{0:D}", dt); // "Sunday, March 09, 2008" LongDate
String.Format("{0:f}", dt); // "Sunday, March 09, 2008 4:05 PM" LongDate+ShortTime
String.Format("{0:F}", dt); // "Sunday, March 09, 2008 4:05:07 PM" FullDateTime
String.Format("{0:g}", dt); // "3/9/2008 4:05 PM" ShortDate+ShortTime
String.Format("{0:G}", dt); // "3/9/2008 4:05:07 PM" ShortDate+LongTime
String.Format("{0:m}", dt); // "March 09" MonthDay
String.Format("{0:y}", dt); // "March, 2008" YearMonth
String.Format("{0:r}", dt); // "Sun, 09 Mar 2008 16:05:07 GMT" RFC1123
String.Format("{0:s}", dt); // "2008-03-09T16:05:07" SortableDateTime
String.Format("{0:u}", dt); // "2008-03-09 16:05:07Z" UniversalSortableDateTime
/*
Specifier DateTimeFormatInfo property Pattern value (for en-US culture)
t ShortTimePattern h:mm tt
d ShortDatePattern M/d/yyyy
T LongTimePattern h:mm:ss tt
D LongDatePattern dddd, MMMM dd, yyyy
f (combination of D and t) dddd, MMMM dd, yyyy h:mm tt
F FullDateTimePattern dddd, MMMM dd, yyyy h:mm:ss tt
g (combination of d and t) M/d/yyyy h:mm tt
G (combination of d and T) M/d/yyyy h:mm:ss tt
m, M MonthDayPattern MMMM dd
y, Y YearMonthPattern MMMM, yyyy
r, R RFC1123Pattern ddd, dd MMM yyyy HH':'mm':'ss 'GMT' (*)
s SortableDateTi­mePattern yyyy'-'MM'-'dd'T'HH':'mm':'ss (*)
u UniversalSorta­bleDateTimePat­tern yyyy'-'MM'-'dd HH':'mm':'ss'Z' (*)
(*) = culture independent
*/
Update
using c# 6 string interpolation format
// create date time 2008-03-09 16:05:07.123
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);
$"{dt:y yy yyy yyyy}"; // "8 08 008 2008" year
$"{dt:M MM MMM MMMM}"; // "3 03 Mar March" month
$"{dt:d dd ddd dddd}"; // "9 09 Sun Sunday" day
$"{dt:h hh H HH}"; // "4 04 16 16" hour 12/24
$"{dt:m mm}"; // "5 05" minute
$"{dt:s ss}"; // "7 07" second
$"{dt:f ff fff ffff}"; // "1 12 123 1230" sec.fraction
$"{dt:F FF FFF FFFF}"; // "1 12 123 123" without zeroes
$"{dt:t tt}"; // "P PM" A.M. or P.M.
$"{dt:z zz zzz}"; // "-6 -06 -06:00" time zone
// month/day numbers without/with leading zeroes
$"{dt:M/d/yyyy}"; // "3/9/2008"
$"{dt:MM/dd/yyyy}"; // "03/09/2008"
// day/month names
$"{dt:ddd, MMM d, yyyy}"; // "Sun, Mar 9, 2008"
$"{dt:dddd, MMMM d, yyyy}"; // "Sunday, March 9, 2008"
// two/four digit year
$"{dt:MM/dd/yy}"; // "03/09/08"
$"{dt:MM/dd/yyyy}"; // "03/09/2008"
You've practically written the format yourself.
yourdate.ToString("yyyyMMddHHmmss")
MM = two digit month
mm = two digit minutes
HH = two digit hour, 24 hour clock
hh = two digit hour, 12 hour clock
Everything else should be self-explanatory.
You've just got to be careful between months (MM) and minutes (mm):
DateTime dt = DateTime.Now; // Or whatever
string s = dt.ToString("yyyyMMddHHmmss");
(Also note that HH is 24 hour clock, whereas hh would be 12 hour clock, usually in conjunction with t or tt for the am/pm designator.)
If you want to do this as part of a composite format string, you'd use:
string s = string.Format("The date/time is: {0:yyyyMMddHHmmss}", dt);
For further information, see the MSDN page on custom date and time formats.
DateTime.Now.ToString("MM/dd/yyyy") 05/29/2015
DateTime.Now.ToString("dddd, dd MMMM yyyy") Friday, 29 May 2015
DateTime.Now.ToString("dddd, dd MMMM yyyy") Friday, 29 May 2015 05:50
DateTime.Now.ToString("dddd, dd MMMM yyyy") Friday, 29 May 2015 05:50 AM
DateTime.Now.ToString("dddd, dd MMMM yyyy") Friday, 29 May 2015 5:50
DateTime.Now.ToString("dddd, dd MMMM yyyy") Friday, 29 May 2015 5:50 AM
DateTime.Now.ToString("dddd, dd MMMM yyyy HH:mm:ss") Friday, 29 May 2015 05:50:06
DateTime.Now.ToString("MM/dd/yyyy HH:mm") 05/29/2015 05:50
DateTime.Now.ToString("MM/dd/yyyy hh:mm tt") 05/29/2015 05:50 AM
DateTime.Now.ToString("MM/dd/yyyy H:mm") 05/29/2015 5:50
DateTime.Now.ToString("MM/dd/yyyy h:mm tt") 05/29/2015 5:50 AM
DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss") 05/29/2015 05:50:06
DateTime.Now.ToString("MMMM dd") May 29
DateTime.Now.ToString("yyyy’-‘MM’-‘dd’T’HH’:’mm’:’ss.fffffffK") 2015-05-16T05:50:06.7199222-04:00
DateTime.Now.ToString("ddd, dd MMM yyy HH’:’mm’:’ss ‘GMT’") Fri, 16 May 2015 05:50:06 GMT
DateTime.Now.ToString("yyyy’-‘MM’-‘dd’T’HH’:’mm’:’ss") 2015-05-16T05:50:06
DateTime.Now.ToString("HH:mm") 05:50
DateTime.Now.ToString("hh:mm tt") 05:50 AM
DateTime.Now.ToString("H:mm") 5:50
DateTime.Now.ToString("h:mm tt") 5:50 AM
DateTime.Now.ToString("HH:mm:ss") 05:50:06
DateTime.Now.ToString("yyyy MMMM") 2015 May
You can use a custom format string:
DateTime d = DateTime.Now;
string dateString = d.ToString("yyyyMMddHHmmss");
Substitute "hh" for "HH" if you do not want 24-hour clock time.
If you use ReSharper, get help with ':' (see image)
In .Net Standard 2 you can format DateTime like belows:
DateTime dt = DateTime.Now;
CultureInfo iv = CultureInfo.InvariantCulture;
// Default formats
// D - long date Tuesday, 24 April 2018
// d - short date 04/24/2018
// F - full date long Tuesday, 24 April 2018 06:30:00
// f - full date short Tuesday, 24 April 2018 06:30
// G - general long 04/24/2018 06:30:00
// g - general short 04/24/2018 06:30
// U - universal full Tuesday, 24 April 2018 06:30:00
// u - universal sortable 2018-04-24 06:30:00
// s - sortable 2018-04-24T06:30:00
// T - long time 06:30:00
// t - short time 06:30
// O - ISO 8601 2018-04-24T06:30:00.0000000
// R - RFC 1123 Tue, 24 Apr 2018 06:30:00 GMT
// M - month April 24
// Y - year month 2018 April
Console.WriteLine(dt.ToString("D", iv));
// Custom formats
// M/d/yy 4/8/18
// MM/dd/yyyy 04/08/2018
// yy-MM-dd 08-04-18
// yy-MMM-dd ddd 08-Apr-18 Sun
// yyyy-M-d dddd 2018-4-8 Sunday
// yyyy MMMM dd 2018 April 08
// h:mm:ss tt zzz 4:03:05 PM -03
// HH:m:s tt zzz 16:03:05 -03:00
// hh:mm:ss t z 04:03:05 P -03
// HH:mm:ss tt zz 16:03:05 PM -03
Console.WriteLine(dt.ToString("M/d/yy", iv));
DateTime.Now.ToString("yyyyMMddHHmmss");
if you just want it displayed as a string
string date = DateTime.Now.ToString("dd-MMM-yy"); //05-Aug-13
Get the date as a DateTime object instead of a String. Then you can format it as you want.
MM/dd/yyyy 08/22/2006
dddd, dd MMMM yyyy Tuesday, 22 August 2006
dddd, dd MMMM yyyy HH:mm Tuesday, 22 August 2006 06:30
dddd, dd MMMM yyyy hh:mm tt Tuesday, 22 August 2006 06:30 AM
dddd, dd MMMM yyyy H:mm Tuesday, 22 August 2006 6:30
dddd, dd MMMM yyyy h:mm tt Tuesday, 22 August 2006 6:30 AM
dddd, dd MMMM yyyy HH:mm:ss Tuesday, 22 August 2006 06:30:07
MM/dd/yyyy HH:mm 08/22/2006 06:30
MM/dd/yyyy hh:mm tt 08/22/2006 06:30 AM
MM/dd/yyyy H:mm 08/22/2006 6:30
MM/dd/yyyy h:mm tt 08/22/2006 6:30 AM
MM/dd/yyyy HH:mm:ss 08/22/2006 06:30:07
Click here for more patterns
I am surprised no one has a link for this .
any format can be created using the guidelines here:
Custom Date and Time Format Strings
For your specific example (As others have indicated) use something like
my_format="yyyyMMddHHmmss";
DateTime.Now.ToString(my_format);
Where my_format can be any string combination of y,M,H,m,s,f,F and more!
Check out the link.
using C# 6.0
$"Date-{DateTime.Now:yyyyMMddHHmmss}"
Specify formatted DateTime as Utc:
Step 1 - Initial date
var initialDtm = DateTime.Now;
Step 2 - Format date as willing ("yyyyMMddHHmmss")
var formattedDtm = DateTime.ParseExact(initialDtm.ToString("yyyyMMddHHmmss"), "yyyyMMddHHmmss", CultureInfo.InvariantCulture);
Step 3 - Specify kind of date (Utc)
var specifiedDtm = DateTime.SpecifyKind(formattedDtm, DateTimeKind.Utc);
An easy Method, Full control over 'from type' and 'to type', and only need to remember this code for future castings
DateTime.ParseExact(InputDate, "dd/MM/yyyy", CultureInfo.InvariantCulture).ToString("yyyy/MM/dd"));
It is not a big deal. you can simply put like this
WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd-HH:mm:ss")}");
Excuse here for I used $ which is for string Interpolation .
Chances are slim that any of the above answers wouldn't has solved your problem. Nonetheless, I'm sharing my method which always works for me for different format of datetimes.
//Definition
public static DateTime ConvertPlainStringToDatetime(string Date, string inputFormat, string outputFormat)
{
DateTime date;
CultureInfo enUS = new CultureInfo("en-US");
DateTime.TryParseExact(Date, inputFormat, enUS,
DateTimeStyles.AdjustToUniversal, out date);
string formatedDateTime = date.ToString(outputFormat);
return Convert.ToDateTime(formatedDateTime);
}
//Calling
string oFormat = "yyyy-MM-dd HH:mm:ss";
DateTime requiredDT = ConvertPlainStringToDatetime("20190205","yyyyMMddHHmmss", oFormat );
DateTime requiredDT = ConvertPlainStringToDatetime("20190508-12:46:42","yyyyMMdd-HH:mm:ss", oFormat);
After spent a lot of hours on Google search, I found the below solution as when I locally give date time, no exception while from other server, there was Error......... Date is not in proper format.. Before saving/ searching Text box date time in C#, just checking either the outer Serer Culture is same like database server culture.. Ex both should be "en-US" or must be both "en-GB" asp below snap shot.
Even with different date format like (dd/mm/yyyy) or (yyyy/mm/dd), it will save or search accurately.

datetime conversion c#

how would you convert this date into c# Datetime object?
Mon Mar 16 14:21:27 +0000 2009
i tried parseexact with format = "ddd MMM dd hh:mm:ss zzzz yyyy" but it didn't work.
what did i do wrong?
For 24-hour hours, you want HH, not hh:
DateTime when = DateTime.ParseExact("Mon Mar 16 14:21:27 +0000 2009",
"ddd MMM dd HH:mm:ss zzzz yyyy",
CultureInfo.InvariantCulture);

Categories