If you don't like the default display of Date objects, you can use the Date function ".toLocaleString()" to display it however you want. For what you're looking for you'd do this:
<<set _timeOptions = { weekday: 'long', year: 'numeric', month: 'numeric', day: 'numeric', hour: 'numeric', minute: 'numeric' }>>
Formatted date: <<print $Appointment.toLocaleString("en-US", _timeOptions)>>
See the link above for an explanation of the options.
As for comparing the dates, "<<if $Appointment == $CurDate>>" won't work because these are objects, and objects aren't equal unless they have the same reference, even if they are otherwise identical in value.
If the dates must match, but the times are irrelevant, then you could use this:
<<if $Appointment.toDateString() == $CurDate.toDateString()>>
If instead you want to figure out if your appointment is within the next half an hour, already passed, or over 30 minutes away, then you could use this:
<<if ($Appointment - $CurDate >= 0) && ($Appointment - $CurDate < 30*60*1000)>>
Time to go!
<<elseif ($Appointment - $CurDate < 0)>>
Too late.
<<else>>
You have plenty of time.
<</if>>
When you subtract one Date object from another, the result is the time difference in milliseconds.
The "30*60*1000" is "30 minutes × 60 seconds × 1000 milliseconds", which translates to "30 minutes worth of milliseconds" or 1800000. You can use that math if you need to represent other time differences.
Hope that helps!