Search code examples
pythondatetimesalesforceapexsoql

Datetime conversions to timestamp


I'm trying to write some code that will filter records from SalesForce that have a value in a field that is not before now. I have given up on trying to format a query that filters the results from SalesForce because not I have tried works and nothing anyone has suggested works (they all return "malformed request"). Although, I'm obviously open to suggestions on that front, too.

So, I have settled on something like this:

        now = datetime.now(pytz.UTC)
        disables = self.sssvc.query("select Name, Project__c, Ownerid, Id, DisableOn__c, User__c from PIXDisableUserTask__c WHERE Status__c = 'Pending'")
        for disable in disables[u'records']:
            disable_on = disable[u'DisableOn__c']
            if disable_on < now:
                continue
            else:
                disables.pop(disable)
            print
        return disables

But when I'm done I end up with two incompatible date formats for comparison. The problem is, I don't know how to convert the value of "now" from datetime and "disable_on" from SalesForce into time stamps that can be compared. What I get is something like:

now = 2015-07-29 19:19:07.322224+00:00
disable_on = u'2015-06-24T12:00:00.000+0000'

I know I need to change disable from a string to an actual datetime object in UTC, but I don't know what formula to use.


Solution

  • For Python 3.x , you can use the following format -

    %Y-%m-%dT%H:%M:%S.%f%z
    

    Example/Demo -

    >>> import datetime
    >>> datetime.datetime.strptime(u'2015-06-24T12:00:00.000+0000','%Y-%m-%dT%H:%M:%S.%f%z')
    datetime.datetime(2015, 6, 24, 12, 0, tzinfo=datetime.timezone.utc)
    

    You can also use the dateutil.parser method given below.


    For Python 2.x , the '%z' directive is not implemented in Python 2.x (Atleast not in my Python 2.6) , but you can use dateutil.parser.parse() for parsing the date -

    >>> import dateutil.parser
    >>> dateutil.parser.parse(u'2015-06-24T12:00:00.000+0000')
    datetime.datetime(2015, 6, 24, 12, 0, tzinfo=tzutc())
    

    Note - You can use dateutil in Python 3 as well.


    So for Python 2.x , your code would look like -

    import dateutil.parser
    now = datetime.now(pytz.UTC)
    disables = self.sssvc.query("select Name, Project__c, Ownerid, Id, DisableOn__c, User__c from PIXDisableUserTask__c WHERE Status__c = 'Pending'")
    for disable in disables[u'records']:
        disable_on = dateutil.parser.parse(disable[u'DisableOn__c'])
        if disable_on < now:
            continue
        else:
            disables.pop(disable)
        print
    return disables