First of all, you shouldn't need to use the ToString() method and then parse it back into DateTime. The field should already be stored as DateTime if it is a date field and as such you just need to cast it as such.
if ((DateTime)listItem["RSDate"] != null)
dt = (DateTime)listItem["RSDate"];
I cast it in the if/else statement so that the cast exception would be thrown sooner. If you just want it to return a null value if it's not a DateTime object (in this case, I don't think you should do this because that really ought to be a DateTime), you can use
if(listItem["RSDate"] as DateTime != null) instead.
Going back the other way (assigning the dt value to the "RSDate" field without casting) should work, or if it doesn't (the dt.Date is in a format that is incompatible with the RSDate field) it should throw an error, not input invalid data.
As to why you're getting the wrong date in there, it might be that somewhere in SP you've got things set to UK date/time values, which if memory serves is DD/MM/YYYY, not MM/DD/YYYY like the US uses. It doesn't matter when you're passing DateTime objects around, but if you convert them into strings you might get errors.