Identify String Value是Apex Salesforce中的Date或DateTime字段

时间:2018-01-03 16:16:17

标签: salesforce apex

使用Salesforce。我有Transaction-1和Transaction-2对象,它与Case对象具有主要的详细关系。动态查询正在创建,它在数据库上执行,结果如下所示。

这是案例的示例结果:

  

({Id = 500c000000B1LYCAA3,CaseNumber__c = RPQ-00001231,CreatedById = 005c000UUUU,LastModifiedDate = 2018-01-02 12:56:03,LastModifiedById = 005c000UUUU,OwnerId = 005c000UUUU,Category__c = Payment,SubCategory__c = Chase Paymentech,Origin = Email,CreatedDate = 2018-01-01 15:22:14,Status = Pending,ContactId = 003c000})

我需要根据登录用户区域设置格式化所有Date和DateTime字段。主要是dd-MM-yyyy。

List<Sobject> s = Database.query(queryStr);

s具有以上所有结果。如何识别所有日期和日期时间字段?我是否需要迭代它并使用RegEx来识别日期或日期/时间字段?

2 个答案:

答案 0 :(得分:0)

我尝试从链接https://releasenotes.docs.salesforce.com/en-us/summer16/release-notes/rn_apex_sobject_getmap.htm

中引用,尝试了类似下面的内容
Map<String, Object> finalMap = new Map<String, Object>();
List<Case> mylist = new List<Case>();
Map<String, Object> fieldsToValue = myCase.getPopulatedFieldsAsMap();
for(String fieldName : fieldsToValue.keySet()){
    if(fieldsToValue.get(fieldName) instanceOf Date){
        Date dateValue = Date.valueOf(fieldsToValue.get(fieldName));
        finalMap.put(fieldName, DateTime.newInstance(dateValue.year(), dateValue.month(), dateValue.day()).format());
    }else if(fieldsToValue.get(fieldName) instanceOf DateTime){
        Date dateValue = Date.valueOf(fieldsToValue.get(fieldName));
        finalMap.put(fieldName, DateTime.newInstance(dateValue.year(), dateValue.month(), dateValue.day()).format());
    }else{
        finalMap.put(fieldName, fieldsToValue.get(fieldName));
    }
}

如何将Map finalMap转换回SObject?

答案 1 :(得分:0)

您是如何创建动态查询的?如果您正在使用“描述”调用来学习Case上所有字段的名称,那么您就不是很远了。

另外请记住,仅仅因为查询是动态的,并不意味着您必须将结果存储在List<sObject>中。将它投射到Cases非常好,然后它们变得更容易使用(如果你将在VF页面上使用结果,它应该为你处理日期格式!)。 List<Case> records = Database.query('SELECT Subject FROM Case LIMIT 10');应该没问题。

但是,如果你真的需要,让我们尝试手动完成。我将阅读Contact上的所有字段(我的开发版中的Case上没有任何日期字段)并检查我应该如何格式化它们。

Map<String, Schema.SObjectField> fieldMap = Schema.SObjectType.Contact.fields.getMap();

Set<String> dateFields = new Set<String>();
Set<String> dateTimeFields = new Set<String>();

List<String> allFields = new List<String>(fieldMap.keyset());
allFields.sort();
System.debug(allFields);

for(String key : fieldMap.keyset()){
    Schema.DescribeFieldResult dfr = fieldMap.get(key).getDescribe();
    Schema.DisplayType t = dfr.getType();
    if(t == DisplayType.Date){
        dateFields.add(key);
    } else if(t == DisplayType.DateTime){
        dateTimeFields.add(key);
    }
}
System.debug('Date: ' + dateFields);
System.debug('DateTime: ' + dateTimeFields);

String query = String.join(new List<String>{
    'SELECT ' + String.join(allFields, ','),
    'FROM Contact',
    'LIMIT 10'
}, '\n');

List<Contact> contacts = (List<Contact>) Database.query(query);
for(Contact c : contacts){
    System.debug(c);
    for(String field : dateFields){
        String value = c.get(field) == null ? '(empty)' : ((Date) c.get(field)).format();
        System.debug(field + ': ' + value);
    }
    for(String field : dateTimeFields){
        String value = c.get(field) == null ? '(empty)' : ((DateTime) c.get(field)).format();
        System.debug(field + ': ' + value);
    }
}