I am passing a DateTime as a Long into my Apex controller and storing it in a variable called start, and it has a value of:


When I create a DateTime from the Long

DateTime startDateTime = DateTime.newInstance(start);
System.debug('startDateTime: ' + startDateTime);

I get the expected output:

startDateTime: 2018-06-06 23:52:10

But when I format it for use in a Dymanic SOQL query like this:


I get a different day and time:


I am using this DateTime to query and the difference in value is leaving out records I am expecting to get.

What am I doing wrong with the DateTime formatting?

  • The latter output is the format you need for SOQL. Why do you think you are doing anything wrong? Are you having trouble running the query?
    – Adrian Larson
    Jun 6 '18 at 23:08
  • I understand the format is what I need for SOQL, but the actual day and time returns from the formatting is different by 12 hours. Which means I don't get the expected result from the query.
    – Robs
    Jun 6 '18 at 23:16

You can format the Datetime instance according to GMT:

String correctTimeZoneValue = DateTime.newInstance(myLong).formatGMT(myFormat);
  • So I should be doing startDateTime.formatGMT('yyyy-MM-dd\'T\'hh:mm:ss\'Z\'')
    – Robs
    Jun 6 '18 at 23:20
  • @Robs Yes. Or you might have to do Datetime.newInstanceGmt(start). Try both.
    – Adrian Larson
    Jun 6 '18 at 23:21
  • DateTime.newInstanceGmt does not take a Long, and startDateTime.formatGMT('yyyy-MM-dd\'T\'hh:mm:ss\'Z\'') does not return the correct value
    – Robs
    Jun 6 '18 at 23:25
  • The values you have provided indicate you have a GMT offset of +11. So using formatGmt should account for that and give you the correct hour. Surely the output is different? What is the new offset?
    – Adrian Larson
    Jun 6 '18 at 23:29
  • I am not setting an offset. The org has a default timezone of (GMT+01:00) British Summer Time (Europe/London).
    – Robs
    Jun 6 '18 at 23:32

To get the correct value formatted as a String for the Dynamic SOQL Query, I needed to use this:



1) the use of DateTime.formatGMT(format); as Adrian Larson suggested


2) the hour needed to be HH rather than hh

Apex code used to debug:

TimeZone tz = UserInfo.getTimeZone();
System.debug('String format: ' + tz.toString());
System.debug('Display name: ' + tz.getDisplayName());
Long start = Long.valueOf('1528329130300');
System.debug('start: ' + start);
DateTime startDateTime = DateTime.newInstance(start);
System.debug('startDateTime: ' + startDateTime);
System.debug('Offset: ' + tz.getOffset(startDateTime));
System.debug('startDateTime: ' + startDateTime.formatGMT('yyyy-MM-dd\'T\'HH:mm:ss\'Z\''));

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.