3

I have javascript date object which gives me a date string in this format, "Tue Sep 04 2012B0100 (GMT Daylight Time)"

I am trying to parse with ParseEaxcat as mentioned here, but it throws an invalid date exception - anyone point me in the direction of the right format

 string date = "Tue Sep 04 2012B0100 (GMT Daylight Time)";
 dt = DateTime.ParseExact(date,"ddd MMM dd yyyyBzzzz",
 CultureInfo.InvariantCulture);

I've also looked at this with no joy: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

asked Sep 4, 2012 at 16:48
3
  • 7
    I may be wrong, but I would imagine the dashes '-' in the format string are causing some grief here, since they aren't in the source string? Commented Sep 4, 2012 at 16:50
  • It sounds like a nonstandard datetime format, are you sure the B is not a plus ? You might need to do some pre-processing on the string to get .NET to parse it. Commented Sep 4, 2012 at 17:05
  • It might be bad to use InvariantCulture when you have English day and month names. Commented Sep 4, 2012 at 17:06

6 Answers 6

8

If you can (and it sounds like you do since you have the object), I'd recommend extracting the number of milliseconds since 1970年01月01日 from Javascript (.getTime()), convert it to .Net ticks (100-nanosecond units), and use that to parse into a C# DateTime.

var ticks = (jsMillis * 10000) + 621355968000000000;
var date = new DateTime(ticks);

where jsMillis is the number you get from calling getTime() on the Javascript DateTime object.

The 621355968000000000 is to convert from C#'s date origin (Midnight Jan 1, 0001) to javascript's date origin.

answered Sep 4, 2012 at 17:06

2 Comments

+1 - Using date.getTime() in JS to get epoch time is the correct way to solve this. Trying to parse date.toString()'s result is fraught with peril. See also the C# epoch conversion functions here.
it's not getTime() - consider using valueOf() which is the number of milliseconds from midnight January 1st 1970
3

This works. Though, you may want to strip the GMT Daylight Time portion out before passing it in just to avoid the in-line split.

string date = "Tue Sep 04 2012B0100 (GMT Daylight Time)";
var dt = DateTime.ParseExact(date.Split('(')[0].Replace("B","+").Trim(), "ddd MMM dd yyyyzzz", CultureInfo.InvariantCulture);

Edited to account for the offset.

answered Sep 4, 2012 at 17:07

3 Comments

You'll note if you ToString that dt you get something like 39/04/12. The 3 is your day of week. Just format it if you need to on the other side like; dt.ToString("mm/dd/yy");
this will work in the sense it won't throw an exception, but will it not just set the UTC offset as the Hours and minutes on the date?
To parse the offset with zzz, it appears it looks for a + modifier. By replacing the B with a + that should get your desired result.
3

I'm getting a different date time format from JavaScript. Here is what I had to do:

public void Main()
{
 Console.WriteLine(
 ConvertJsDate("Fri Apr 18 2014 16:23:18 GMT-0500 (Central Daylight Time)"));
 //test more regular date
 Console.WriteLine(
 ConvertJsDate("4/18/2014 16:23:18")); 
}
public DateTime ConvertJsDate(string jsDate)
{
 string formatString = "ddd MMM d yyyy HH:mm:ss";
 var gmtIndex = jsDate.IndexOf(" GMT");
 if (gmtIndex > -1) 
 {
 jsDate = jsDate.Remove(gmtIndex);
 return DateTime.ParseExact(jsDate, formatString, null);
 }
 return DateTime.Parse(jsDate);
}
answered Apr 18, 2014 at 19:26

Comments

0

The date doesn't appear to match the format string. The format string has hyphens, and is missing the parenthesized section. Also, there is no mention of a format string with 4 z's, so you might change the first one to a 0.

answered Sep 4, 2012 at 17:07

Comments

0

Alternative approach is to convert date into reasonable representation on JavaScript side will be significantly more robust: no need to guess language server side, may handle timezones correctly.

If you use some sort of automated conversion (i.e. JSON.stringify) you may need to add one more field parallel to your date field with string representation of the same value and use it on server side instead of original one.

{ dateFied: new Date(),
 dateFiledAsIsoString: "....." }

If decided to go this route consider also passing Time Zone (time offset) to server side code or converting time to UTC on JavaScript side. Consider using ISO8601 format for date: yyyy-MM-ddTHH:mm:ss.fffffffzzz.

answered Sep 4, 2012 at 17:27

5 Comments

You're right on the first part - JS should convert the Date into a more reliable representation. However, rather than dealing with strings, just use getTime() to get the number of ticks since epoch. That way, you don't have to worry about timezones at all.
@josh3736, I'm not exactly sure how you can get away from not dealing with timezones if you use ticks (unless you convert to UTC first and than to ticks, which I think is not what you are suggesting)?
getTime always deals in UTC automatically.
@josh3736, care to provide a link? To my knowledge it is simply offset from particular moment in local time (January 1, 1970), but you can't convert number like 1346789616870 to correct time without knowledge of timezone it was computed...
getTime on MDN: "Returns the numeric value corresponding to the time for the specified date according to universal time."
0

There are a lot of ways to do this... But this is what I find to be the simplest...

// JavaScript
var d = new Date();
d.toLocaleString();
// => "6/26/2015, 2:07:25 PM"
// Can be Parsed by the C# DateTime Class
DateTime d = DateTime.Parse( @"6/26/2015, 2:07:25 PM" );
Console.WriteLine( d.ToLongDateString() );
// => Friday, June 26, 2015
answered Jun 26, 2015 at 18:13

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.