function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
sumit dsumit d 

System.TypeException: Invalid date: 2019-05-06T13:33:15Z

Hi All,
i have a batch in which i am updating case field ClosedDate to a field coming from Zendesk Api Solved_at . but when i tried to run the batch its giving me the error :-   System.TypeException: Invalid date: 2019-05-06T13:33:15Z
the api response is in this format:-"solved_at": "2019-04-09T17:43:33Z",
my batch is given below:-


public class BatchZendeskClosedDate implements Database.Batchable<sObject>,Database.AllowsCallouts, Database.Stateful {
        string query;
    public static void run( Set<Id> caseIds ){
        List<Case> caseList = [ SELECT Id, Zd_Zendesk_Id__c  
                                           FROM Case 
                                           WHERE Zd_Zendesk_Id__c != null AND  Id IN: caseIds ];
        executeHelper(caseList);
    }
     public Database.querylocator start(Database.BatchableContext BC){
        query = 'SELECT Id,Zd_Zendesk_Id__c ' +
                'FROM Case ' +
                'WHERE Zd_Zendesk_Id__c != null ';
                 return Database.getQueryLocator(query);
     }
    //execute method to update Case solvedDate
    public void execute( Database.BatchableContext BC, List<Case> caseList){
        executeHelper(caseList);
     }
     public static void executeHelper( List<Case> caseList ){
        List<Case> updateCase = new List<Case>();
        for( Case cs : caseList ){
            HttpRequest req = new HttpRequest();
            req.setMethod( 'GET' );
            String username = System.Label.Zendesk_UserName;
            String password = System.Label.Zendesk_Password;
            Blob headerValue = Blob.valueOf( username + ':' + password );
            String authorizationHeader = 'BASIC ' + EncodingUtil.base64Encode( headerValue );
            req.setHeader( 'Authorization', authorizationHeader );
            req.setHeader( 'Content-Type', 'application/json' );
            req.setEndpoint( 'https://timerack.zendesk.com/api/v2/ticket_metrics.json' );
            Http binding = new Http();
            HttpResponse res = binding.send( req );
             Map<String, Object> results = ( Map<String, Object> )JSON.deserializeUntyped( res.getBody() );
            List<Object> lstCases = ( List<Object> )results.get( 'ticket_metrics' );
            List<Map<String, Object>> casesAtt = new List< Map< String, Object >>();
            for ( Object Cases : lstCases ) {
                Map<String, Object> casesAttributes = ( Map< String, Object >)Cases;
                casesAtt.add( casesAttributes );
            }
            //List< case > listCasesToUpdate = new List< case >();
            for( Map< String, Object> attMap : casesAtt ){
                Case ct = new Case(); 
                ct.ClosedDate = Date.valueOf( attMap.get( 'solved_at' ));
                updateCase.add(ct);
             }
         }
        if(updateCase.Size()>0){
            update updateCase;
        }
        
    }
        public void finish(Database.BatchableContext BC){
     }
 }
how to solve this error?
Any suggestions?
Raj VakatiRaj Vakati
You are trying to convert the date time into date .. update code like below 

 
public class BatchZendeskClosedDate implements Database.Batchable<sObject>,Database.AllowsCallouts, Database.Stateful {
        string query;
    public static void run( Set<Id> caseIds ){
        List<Case> caseList = [ SELECT Id, Zd_Zendesk_Id__c  
                                           FROM Case 
                                           WHERE Zd_Zendesk_Id__c != null AND  Id IN: caseIds ];
        executeHelper(caseList);
    }
     public Database.querylocator start(Database.BatchableContext BC){
        query = 'SELECT Id,Zd_Zendesk_Id__c ' +
                'FROM Case ' +
                'WHERE Zd_Zendesk_Id__c != null ';
                 return Database.getQueryLocator(query);
     }
    //execute method to update Case solvedDate
    public void execute( Database.BatchableContext BC, List<Case> caseList){
        executeHelper(caseList);
     }
     public static void executeHelper( List<Case> caseList ){
        List<Case> updateCase = new List<Case>();
        for( Case cs : caseList ){
            HttpRequest req = new HttpRequest();
            req.setMethod( 'GET' );
            String username = System.Label.Zendesk_UserName;
            String password = System.Label.Zendesk_Password;
            Blob headerValue = Blob.valueOf( username + ':' + password );
            String authorizationHeader = 'BASIC ' + EncodingUtil.base64Encode( headerValue );
            req.setHeader( 'Authorization', authorizationHeader );
            req.setHeader( 'Content-Type', 'application/json' );
            req.setEndpoint( 'https://timerack.zendesk.com/api/v2/ticket_metrics.json' );
            Http binding = new Http();
            HttpResponse res = binding.send( req );
             Map<String, Object> results = ( Map<String, Object> )JSON.deserializeUntyped( res.getBody() );
            List<Object> lstCases = ( List<Object> )results.get( 'ticket_metrics' );
            List<Map<String, Object>> casesAtt = new List< Map< String, Object >>();
            for ( Object Cases : lstCases ) {
                Map<String, Object> casesAttributes = ( Map< String, Object >)Cases;
                casesAtt.add( casesAttributes );
            }
            //List< case > listCasesToUpdate = new List< case >();
            for( Map< String, Object> attMap : casesAtt ){
                Case ct = new Case(); 
				 DateTime dT = DateTime.valueOf(attMap.get( 'solved_at' ));
                ct.ClosedDate = date.newinstance(dT.year(), dT.month(), dT.day());
                updateCase.add(ct);
             }
         }
        if(updateCase.Size()>0){
            update updateCase;
        }
        
    }
        public void finish(Database.BatchableContext BC){
     }
 }

 
sumit dsumit d
Hi raj,
its still giving me this error:-
 Invalid date/time: 2019-05-06T13:33:15Z
Can you help me out with this?
sumit dsumit d
when i tried like this:- String s1 = ( attMap.get( 'solved_at' )).substringBefore('T');
                                   caseObj.ClosedDate = Date.valueOf(s1);
its giving me error that method does not exist.
Any suggestions?
Raj VakatiRaj Vakati
Try this
 
public class BatchZendeskClosedDate implements Database.Batchable<sObject>,Database.AllowsCallouts, Database.Stateful {
        string query;
    public static void run( Set<Id> caseIds ){
        List<Case> caseList = [ SELECT Id, Zd_Zendesk_Id__c  
                                           FROM Case 
                                           WHERE Zd_Zendesk_Id__c != null AND  Id IN: caseIds ];
        executeHelper(caseList);
    }
     public Database.querylocator start(Database.BatchableContext BC){
        query = 'SELECT Id,Zd_Zendesk_Id__c ' +
                'FROM Case ' +
                'WHERE Zd_Zendesk_Id__c != null ';
                 return Database.getQueryLocator(query);
     }
    //execute method to update Case solvedDate
    public void execute( Database.BatchableContext BC, List<Case> caseList){
        executeHelper(caseList);
     }
     public static void executeHelper( List<Case> caseList ){
        List<Case> updateCase = new List<Case>();
        for( Case cs : caseList ){
            HttpRequest req = new HttpRequest();
            req.setMethod( 'GET' );
            String username = System.Label.Zendesk_UserName;
            String password = System.Label.Zendesk_Password;
            Blob headerValue = Blob.valueOf( username + ':' + password );
            String authorizationHeader = 'BASIC ' + EncodingUtil.base64Encode( headerValue );
            req.setHeader( 'Authorization', authorizationHeader );
            req.setHeader( 'Content-Type', 'application/json' );
            req.setEndpoint( 'https://timerack.zendesk.com/api/v2/ticket_metrics.json' );
            Http binding = new Http();
            HttpResponse res = binding.send( req );
             Map<String, Object> results = ( Map<String, Object> )JSON.deserializeUntyped( res.getBody() );
            List<Object> lstCases = ( List<Object> )results.get( 'ticket_metrics' );
            List<Map<String, Object>> casesAtt = new List< Map< String, Object >>();
            for ( Object Cases : lstCases ) {
                Map<String, Object> casesAttributes = ( Map< String, Object >)Cases;
                casesAtt.add( casesAttributes );
            }
            //List< case > listCasesToUpdate = new List< case >();
            for( Map< String, Object> attMap : casesAtt ){
                Case ct = new Case(); 
				DateTime dt = (DateTime) JSON.deserialize('"' + attMap.get( 'solved_at' ) + '"', DateTime.class);
									
                ct.ClosedDate = date.newinstance(dT.year(), dT.month(), dT.day()); 
                updateCase.add(ct);
             }
         }
        if(updateCase.Size()>0){
            update updateCase;
        }
        
    }
        public void finish(Database.BatchableContext BC){
     }
 }

 
Raj VakatiRaj Vakati
https://salesforce.stackexchange.com/questions/1013/parsing-an-iso-8601-timestamp-to-a-datetime