I'am reading calls from Android call log. Date format is something that Delhi don't recognise. Date is returned like this: "1587377791601".   Any idea what this number means and how to get date and time from it?   Here's code what works, i have commented out lines what i don't want use. In commented lines is (StringToJString(...)) but it must be ( TJCallLog_Calls.JavaClass....) :   var   cursor: JCursor;   uri: Jnet_Uri;   CACHED_FORMATTED_NUMBER, CACHED_LOOKUP_URI, CACHED_MATCHED_NUMBER, CACHED_NAME,   CACHED_NORMALIZED_NUMBER, CACHED_NUMBER_LABEL, CACHED_NUMBER_TYPE, CACHED_PHOTO_ID,   CONTENT_ITEM_TYPE, CONTENT_TYPE, COUNTRY_ISO, DATA_USAGE, DATE, DEFAULT_SORT_ORDER, DURATION,   EXTRA_CALL_TYPE_FILTER, FEATURES, IS_READ, LIMIT_PARAM_KEY, NEW, NUMBER, NUMBER_PRESENTATION,   OFFSET_PARAM_KEY, PHONE_ACCOUNT_COMPONENT_NAME, PHONE_ACCOUNT_ID, TRANSCRIPTION, TYPEX, VOICEMAIL_URI : integer;   msgunixtimestampms:int64;   CACHED_FORMATTED_NUMBERx, CACHED_LOOKUP_URIx, CACHED_MATCHED_NUMBERx, CACHED_NAMEx,   CACHED_NORMALIZED_NUMBERx, CACHED_NUMBER_LABELx, CACHED_NUMBER_TYPEx, CACHED_PHOTO_IDx,   CONTENT_ITEM_TYPEx, CONTENT_TYPEx, COUNTRY_ISOx, DATA_USAGEx, DATEx, DEFAULT_SORT_ORDERx, DURATIONx,   EXTRA_CALL_TYPE_FILTERx, FEATURESx, IS_READx, LIMIT_PARAM_KEYx, NEWx, NUMBERx, NUMBER_PRESENTATIONx,   OFFSET_PARAM_KEYx, PHONE_ACCOUNT_COMPONENT_NAMEx, PHONE_ACCOUNT_IDx, TRANSCRIPTIONx, TYPEXx, VOICEMAIL_URIx : string;   CallTime: TDateTime;   Result: String; begin   uri:=StrToJURI('content://call_log/calls');   cursor := SharedActivity.getContentResolver.query(uri, nil, nil,nil,nil); //  CACHED_FORMATTED_NUMBER:=cursor.getColumnIndex(StringToJstring('CACHED_FORMATTED_NUMBER')); //  CACHED_LOOKUP_URI:=cursor.getColumnIndex(StringToJstring('CACHED_LOOKUP_URI')); //  CACHED_MATCHED_NUMBER:=cursor.getColumnIndex(StringToJstring('CACHED_MATCHED_NUMBER'));     CACHED_NAME:=cursor.getColumnIndex( TJCallLog_Calls.JavaClass.CACHED_NAME ); //  CACHED_NORMALIZED_NUMBER:=cursor.getColumnIndex(StringToJstring('CACHED_NORMALIZED_NUMBER')); //  CACHED_NUMBER_LABEL:=cursor.getColumnIndex(StringToJstring('CACHED_NUMBER_LABEL')); //  CACHED_NUMBER_TYPE:=cursor.getColumnIndex(StringToJstring('CACHED_NUMBER_TYPE')); //  CACHED_PHOTO_ID:=cursor.getColumnIndex(StringToJstring('CACHED_PHOTO_ID')); //  CONTENT_ITEM_TYPE:=cursor.getColumnIndex(StringToJstring('CONTENT_ITEM_TYPE')); //  CONTENT_TYPE:=cursor.getColumnIndex(StringToJstring('CONTENT_TYPE')); //  COUNTRY_ISO:=cursor.getColumnIndex(StringToJstring('COUNTRY_ISO')); //  DATA_USAGE:=cursor.getColumnIndex(StringToJstring('DATA_USAGE'));     DATE:=cursor.getColumnIndex( TJCallLog_Calls.JavaClass.DATE ); //  DEFAULT_SORT_ORDER:=cursor.getColumnIndex(StringToJstring('DEFAULT_SORT_ORDER'));     DURATION:=cursor.getColumnIndex( TJCallLog_Calls.JavaClass.DURATION ); //  EXTRA_CALL_TYPE_FILTER:=cursor.getColumnIndex(StringToJstring('EXTRA_CALL_TYPE_FILTER')); //  FEATURES:=cursor.getColumnIndex(StringToJstring('FEATURES')); //  IS_READ:=cursor.getColumnIndex(StringToJstring('IS_READ')); //  LIMIT_PARAM_KEY:=cursor.getColumnIndex(StringToJstring('LIMIT_PARAM_KEY')); //  NEW:=cursor.getColumnIndex(StringToJstring('NEW')); //  NUMBER:=cursor.getColumnIndex(StringToJstring('NUMBER')); //  NUMBER_PRESENTATION:=cursor.getColumnIndex(StringToJstring('NUMBER_PRESENTATION')); //  OFFSET_PARAM_KEY:=cursor.getColumnIndex(StringToJstring('OFFSET_PARAM_KEY')); //  PHONE_ACCOUNT_COMPONENT_NAME:=cursor.getColumnIndex(StringToJstring('PHONE_ACCOUNT_COMPONENT_NAME')); //  PHONE_ACCOUNT_ID:=cursor.getColumnIndex(StringToJstring('PHONE_ACCOUNT_ID')); //  NUMBER_PRESENTATION:=cursor.getColumnIndex(StringToJstring('NUMBER_PRESENTATION')); //  TRANSCRIPTION:=cursor.getColumnIndex(StringToJstring('TRANSCRIPTION')); //  TYPEX:=cursor.getColumnIndex(StringToJstring('TYPE'));  while (cursor.moveToNext) do begin //  CACHED_FORMATTED_NUMBERx:=JStringToString(cursor.getString(CACHED_FORMATTED_NUMBER)); //  CACHED_LOOKUP_URIx:=JStringToString(cursor.getString(CACHED_LOOKUP_URI)); //  CACHED_MATCHED_NUMBERx:=JStringToString(cursor.getString(CACHED_MATCHED_NUMBER));     CACHED_NAMEx:=JStringToString(cursor.getString(CACHED_NAME)); //  CACHED_NORMALIZED_NUMBERx:=JStringToString(cursor.getString(CACHED_NORMALIZED_NUMBER)); //  CACHED_NUMBER_LABELx:=JStringToString(cursor.getString(CACHED_NUMBER_LABEL)); //  CACHED_NUMBER_TYPEx:=JStringToString(cursor.getString(CACHED_NUMBER_TYPE)); //  CACHED_PHOTO_IDx:=JStringToString(cursor.getString(CACHED_PHOTO_ID)); //  CONTENT_ITEM_TYPEx:=JStringToString(cursor.getString(CONTENT_ITEM_TYPE)); //  CONTENT_TYPEx:=JStringToString(cursor.getString(CONTENT_TYPE)); //  COUNTRY_ISOx:=JStringToString(cursor.getString(COUNTRY_ISO)); //  DATA_USAGEx:=JStringToString(cursor.getString(DATA_USAGE));     DATEx:=JStringToString(cursor.getString(DATE)); //  DEFAULT_SORT_ORDERx:=JStringToString(cursor.getString(DEFAULT_SORT_ORDER));     DURATIONx:=JStringToString(cursor.getString(DURATION)); //  EXTRA_CALL_TYPE_FILTERx:=JStringToString(cursor.getString(EXTRA_CALL_TYPE_FILTER)); //  FEATURESx:=JStringToString(cursor.getString(FEATURES)); //  IS_READx:=JStringToString(cursor.getString(IS_READ)); //  LIMIT_PARAM_KEYx:=JStringToString(cursor.getString(LIMIT_PARAM_KEY)); //  NEWx:=JStringToString(cursor.getString(NEW)); //  NUMBERx:=JStringToString(cursor.getString(NUMBER)); //  NUMBER_PRESENTATIONx:=JStringToString(cursor.getString(NUMBER_PRESENTATION)); //  OFFSET_PARAM_KEYx:=JStringToString(cursor.getString(OFFSET_PARAM_KEY)); //  PHONE_ACCOUNT_COMPONENT_NAMEx:=JStringToString(cursor.getString(PHONE_ACCOUNT_COMPONENT_NAME)); //  PHONE_ACCOUNT_IDx:=JStringToString(cursor.getString(PHONE_ACCOUNT_ID)); //  NUMBER_PRESENTATIONx:=JStringToString(cursor.getString(NUMBER_PRESENTATION)); //  TRANSCRIPTIONx:=JStringToString(cursor.getString(TRANSCRIPTION)); //  TYPEXx:=JStringToString(cursor.getString(TYPEX));     CallTime := StrToDateTime(DATEx); <- THIS DON'T WORK!     Result := CACHED_NAMEx + ' ' + FormatDateTime('dd.mm.yyyy hh:mm:ss', CallTime) + ' ' + DURATIONx;     ShowMessage(Result);     end;