accountExpires attribute import to User Table

Cory Hitchings
Giga Guru

Hi all, 

I've been trying to import the accountExpires attribute from AD into ServiceNow sys_user table and having some issues with the date format. 

I have a new field on the sys_user form called u_end_date in a Date/Time variable with a limit of 100.  

Our AD date format appears like this:  

find_real_file.png

(Month/Day/Year) (Hour:Minutes:Seconds) (AM/PM) (Timezone)

Looking at this, it leads me to believe the format should be: 

mm/dd/yyyy hh:mm:ss a z

However; when I run the LDAP User import, it errors on each individual with an accountExpires date with this message: Unable to format undefined using format string MM/dd/yyyy hh:mm:ss a z for field u_end_date 

Here is my script for accountExpires Field Map: 

answer = (function transformEntry(source) {
	// This function converts the UTC date/time to local date/time
function getLocalTimeZoneDateTime(dateTimeUTC) {
  var gdt = new GlideDateTime(dateTimeUTC);
  return gdt.getDisplayValueInternal();
}

var dtUtil = new DateTimeUtils();

if (source.u_accountexpires === undefined) {
      // set a blank value if the source is 'undefined'
      target.setValue(u_end_date,'');
} else if (source.u_accountexpires != 0) {
      // convert the date from int8 format to GlideDateTime in UTC
      var expiresUTC = dtUtil.int8ToGlideDateTime(source.u_accountexpires);
      // convert the GlideDateTime in UTC to Local TimeZone
      var expiresLocal = getLocalTimeZoneDateTime(expiresUTC.toString());
      //log.info("ExpiresLocal: " + expiresLocal);
      // Set the value to the Local Time Zone value
      answer = expiresLocal;
} else {
      // set a blank value if the source is anything else.
      target.setValue("u_end_date",'');
}

// 	return ""; // return the value to be put into the target field

})(source);

I've tried the following but out success with any of these variations:

MM/dd/yyyy hh:mm:ss
yyyy/dd/MM hh:mm:ss

MM/dd/yyyy hh:mm:ss a
yyyy/dd/MM hh:mm:ss a

MM/dd/yyyy hh:mm:ss z
yyyy/dd/MM hh:mm:ss z

MM/dd/yyyy hh:mm:ss a z
yyyy/dd/MM hh:mm:ss a z

Any ideas what date format this should be configured as?  Thanks so much in advance! 

1 ACCEPTED SOLUTION

Mike Patel
Tera Sage

I use below to onBefore transform script to import that from AD. (Make sure to remove field mapping)

// Updates the SN Account Expires field   
var n = source.u_accountexpires;  
var s = n.toString();  

// Only convert AD accountExpires values that begin with 1 (ex. 0 represents never expires)  
if (s.charAt(0) == 1) {  
	var dtUtil = new DateTimeUtils();
	var gDate = dtUtil.int8ToGlideDateTime(n);
	gDate.addDaysLocalTime(-1);
	target.u_account_expires = gDate;  
}else if(!target.u_account_expires.nil()) {  
	target.u_account_expires = '';  
}  

find_real_file.png

View solution in original post

24 REPLIES 24

Well Mike, that was it 100%.  Thank you so very much for your help and your patience with this one.  Truly appreciate your diligence!  Merry Christmas and have a Happy healthy New Year!  Take good care!

Ankur Bawiskar
Tera Patron
Tera Patron

@Cory Hitchings 

Can you use this in your onBefore transform script

(function runTransformScript(source, map, log, target /*undefined onStart*/ ) {

	// Add your code here

var incomingValue = source.u_accountexpires;

var gdt = new GlideDateTime();

gdt.setDisplayValue(str, "MM/dd/yyyy hh:mm:ss a z");

target.u_end_date = gdt.getValue();

})(source, map, log, target);

Regards
Ankur

 

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

@Cory Hitchings 

The value in the import set table doesn't seem to be of that format

MM/dd/yyyy hh:mm:ss a z

Regards
Ankur

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

Hi Ankur, 

Thank you, I have tried your code for the onBefore transform script using both "MM/dd/yyyy hh:mm:ss a z" and "MM/dd/yyyy hh:mm:ss" with no success.   All fields are still showing (empty) after the import.  

Can you try using below ?

var incomingValue = source.u_accountexpires;
incomingValue = incomingValue.toString().subString(0,22);

var gdt = new GlideDateTime();

gdt.setDisplayValue(incomingValue, "MM/dd/yyyy hh:mm:ss a");

target.u_end_date = gdt.getValue();