This happens when the time zone of the server does not match the time zone of the site (or that of the user if they have set a time zone override preference).
When you use the Collect Data From User workflow action to collect a "date and time" value and configure it to display as "date only", the value is still stored as a date and time, which defaults to midnight of the selected date. The form is displayed to the user according to the time zone configured at the site level, or that of the user's preferences if they have set an override. If, for example, the site is configured to use CST and the server is configured to use PST (and the user has not set an override), when the user submits the form, selecting
10/03/2011, it is converted to
10/03/2011 00:00:00 CST, and then stored in the server's database as
10/02/2011 22:00:00 PST (which is, in fact, the same time). But then, when the list is viewed, because the field is configured to display "date only", you just see
first, change the field to display "date and time" so you can determine the difference between site and server time zones. Then, in your workflow, after the Collect Data From User action, use the Add Time To Date action to add the appropriate number of hours to the user's input, and store the result of that calculation in the list field. Once you've verified that this is working correctly, you can switch it back to displaying "date only" if you so desire, but remember to also account for Daylight Savings Time, if necessary.
You may also find it helpful to use Log To Workflow History actions liberally, to serve the role of a watch function in a programming environment. For example:
Log "Collecting Due Date from User..." to the workflow history list
then Collect "Enter Due Date" from User (Output to Variable: ID of Due Date Task)
then Log "Due Date set to [%Workflow Tasks: Due Date%]" to the workflow history list
then Add 3 hours to Workflow Tasks: Due Date (Output to Variable: Adjusted Due Date)
then Log "Due Date adjusted to [%Variable: Adjusted Due Date%]" to the workflow history list
then Set Due Date to Variable: Adjusted Due Date
then Log "Due date is stored in list as [%Current Item:Due Date%]" to the workflow history list