We are creating a Visualforce email template to be sent when certain Events are saved/edited to meet criteria. The VF Template is related To Event/Contact:

<messaging:emailTemplate subject="Appointment Reminder" recipientType="Contact" relatedToType="Event">

I am working on outputting the Date, and Start - End time of the Appointment (Event), in EST, to send to our customers, like this:

Event Name


05:00 PM - 6:00 PM EST

Currently I am using the following formatting to output the date and date/time values to the template:

<apex:outputText value="{0,date,MM/dd/yyyy}">
    <apex:param value="{!relatedTo.ActivityDate}" />
</apex:outputText><br />

<apex:outputText value="{0,date,hh:mm:ss a}">
    <apex:param value="{!relatedTo.StartDateTime}" />
<apex:outputText value="{0,date,hh:mm:ss a}">
    <apex:param value="{!relatedTo.EndDateTime}" />
</apex:outputText><br />

However, most of us probably already know that Salesforce stores datetime values in GMT. My appointment is booked at 5-6PM EST, but the GMT conversion makes it 9-10PM GMT, so the above code is resulting in this output:

Template Example 1

I would like to output the times in Eastern, regardless of who the template is being sent to, since all of our customers know that we book in eastern time. I could possibly hard code this with something like {!relatedTo.StartDateTime-(4/24)} but that will only work until we change times during Daylight savings spring forward/fall back times.

Question: I'm trying to avoid making a component and a custom controller for the purposes of outputting just 2 date fields, so figured I'd come to the best Salesforce community I know to see if there were any trade secrets I could use or things I missed that would allow me to force the output into EST - specifically in a way that accounts for daylight savings and doesn't require a component and controller. Is this possible?


You need to use custom controller or extension to build the logic of offset.

You can easily get the timezone string of the user by:


Then add the offset to your datetime:

d.addHours(the offest);

Use this method

public static Integer timeZoneOffset_hours(Date d, String tz) {
    TimeZone tzSelected = TimeZone.getTimeZone(tz);
    TimeZone tzGmt = TimeZone.getTimeZone('Greenwich Mean Time');

    Integer gmtOffset = tzGmt.getOffset(d);
    Integer selectedOffset = tzSelected.getOffset(d);
    Integer hours = (selectedOffset - gmtOffset) / 1000 / 60 / 60; 

    return hours;

And finally display that on screen.

  • We can't use custom controllers directly in Visualforce email templates, which means in order to implement your solution I would need a VF component with an apex controller to embed in the VF email template. – Morgan Marchese May 10 '17 at 15:01
  • My logic is different than yours - I ended up just passing the GMT datetime that Salesforce already stores into the DateTime.format() method and passed in the desired TimeZone for my formatted response dt.format(gmtDate,'America/New_York') – Morgan Marchese May 10 '17 at 15:02

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.