Salesforce 日期时间和日期比较

Salesforce 日期时间和日期比较,salesforce,Salesforce,为什么这句话会变成真的?我知道我在比较日期和日期时间变量,但我在寻找更技术性的解释 DateTime dt = DateTime.newInstance(2012,04,30,0,0,0); system.debug(dt > Date.valueOf('2012-04-30')); 此外,2012-04-30之前的日期时间值(对于dt变量)也会返回真值吗?注释中指出,这可能是由于时区转换以及午夜(00:00:00)被附加到日期以进行比较。短篇故事:他是对的,因为午夜被附加到比较的日期。

为什么这句话会变成真的?我知道我在比较
日期
日期时间
变量,但我在寻找更技术性的解释

DateTime dt = DateTime.newInstance(2012,04,30,0,0,0);
system.debug(dt > Date.valueOf('2012-04-30'));
此外,2012-04-30之前的日期时间值(对于dt变量)也会返回真值吗?

注释中指出,这可能是由于时区转换以及午夜(
00:00:00
)被附加到日期以进行比较。短篇故事:他是对的,因为午夜被附加到比较的日期。详情如下

我需要看到这一点的行动,以完全理解它;所以,我写了一段代码

for(Integer mo=4; mo<6; mo++) // test April (4) and May (5) only
    for(Integer d=(mo==4?29:0); d<=(mo==5?2:30); d++) // test between 2012-04-29 and 2012-05-30
        for(Integer h=0; h<12; h++)
            for(Integer m=0; m<60; m++)
            {
                // this simulates a CreatedDate field (note it is generated using the newInstanceGMT method and not simply newInstance)
                // DateTime fields in Salesforce are stored in GMT then converted to the current User's time-zone. 
                DateTime dt1 = DateTime.newInstanceGMT(2012,mo,d,h,m,0); 
                Date dt2 = Date.valueOf('2012-04-30');
                if(dt1 > dt2) { 
                    system.debug(LoggingLevel.INFO,'DateTime:'+dt1+' > Date:'+dt2); }
            }
最简单的解决方案是与
Date.valueOf('2012-05-01')进行比较。但是,可以使用DateTime类型上的
newInstanceGMT
方法与CreatedDate字段进行比较。使用DateTime方法,需要考虑午夜

DateTime dt1 = DateTime.newInstanceGMT(2012,mo,d,h,m,0); // simulated CreatedDate field
Date dt2 = Date.valueOf('2012-05-01'); 
if(dt1 > dt2) { 
    system.debug(LoggingLevel.INFO,'DateTime:'+dt1+' > Date:'+dt2); }

这两种方法都产生了预期的结果:

USER_DEBUG|[9]|INFO|DateTime:2012-05-01 00:00:00 > Date:2012-04-30 12:59:59
USER_DEBUG|[9]|INFO|DateTime:2012-05-01 00:01:00 > Date:2012-04-30 12:59:59
USER_DEBUG|[9]|INFO|DateTime:2012-05-01 00:02:00 > Date:2012-04-30 12:59:59
...
USER_DEBUG|[9]|INFO|DateTime:2012-05-02 11:57:00 > Date:2012-04-30 12:59:59
USER_DEBUG|[9]|INFO|DateTime:2012-05-02 11:58:00 > Date:2012-04-30 12:59:59
USER_DEBUG|[9]|INFO|DateTime:2012-05-02 11:59:00 > Date:2012-04-30 12:59:59

我认为它可能与TZ有关,不要认为Date only val有任何TZ信息。好主意,但是DateTime为
DateTime.newInstance(2012,04,30,12,0,0)
也会返回true,中午12点多会补偿时区差异。但该值始终大于日期。(我想象这个日期实际上是比较的日期+午夜)这是有道理的,我没有考虑日期+午夜。谢谢
DateTime dt1 = DateTime.newInstanceGMT(2012,mo,d,h,m,0); // simulated CreatedDate field
DateTime dt2 = DateTime.newInstanceGMT(2012,04,30,12,59,59); 
if(dt1 > dt2) { 
    system.debug(LoggingLevel.INFO,'DateTime:'+dt1+' > Date:'+dt2); }
USER_DEBUG|[9]|INFO|DateTime:2012-05-01 00:00:00 > Date:2012-04-30 12:59:59
USER_DEBUG|[9]|INFO|DateTime:2012-05-01 00:01:00 > Date:2012-04-30 12:59:59
USER_DEBUG|[9]|INFO|DateTime:2012-05-01 00:02:00 > Date:2012-04-30 12:59:59
...
USER_DEBUG|[9]|INFO|DateTime:2012-05-02 11:57:00 > Date:2012-04-30 12:59:59
USER_DEBUG|[9]|INFO|DateTime:2012-05-02 11:58:00 > Date:2012-04-30 12:59:59
USER_DEBUG|[9]|INFO|DateTime:2012-05-02 11:59:00 > Date:2012-04-30 12:59:59