I'm stumped. Been through many articles, even tried ChatGPT to find Velocity Script that changes the date format on a token in an email. I do have an Account field that pulls in the date successfully: {{Company.Renewal Date}}, but in the Mkto standard yyyy-MM-dd, or 2023-12-22. I want it to be MMMM dd, yyyy or December 22, 2023. Velocity script doesn't seem to support Account fields so I had my Sales Ops create a Contact field, {{lead.Account Renewal Date}} to pull in from the Account field. I CAN see this field in the VS objects list. My referring "my.token" in this case is {{my.RenewalDate}} and it "tries" to use the following VS to no avail.
Appreciate any feedback for fix suggestions.
#set( $dateOptions = {
"formats" : {
"userin" : "yyyy-MM-dd HH:mm:ss",
"userout" : "MMMM d, yyyy 'at' HH:mm:ss z"
},
"timezones" : {
"userin" : "America/New_York",
"userout" : "America/New_York"
},
"locale" : $date.getLocale()
})
#set( $renewalDatelike = $lead.account_renewal_date__c )
#set( $renewalDate = $convert.parseDate(
$renewalDatelike,
$dateOptions.formats.userin,
$dateOptions.locale,
$date.getTimeZone().getTimeZone($dateOptions.timezones.userin)
) )
#set( $renewalDate_formatted = $date.format(
$dateOptions.formats.userout,
$renewalDate,
$dateOptions.locale,
$date.getTimeZone().getTimeZone($dateOptions.timezones.userout)
) )
$renewalDate_formatted
Solved! Go to Solution.
You shouldn’t be using formal notation here:
#set( $myDate = $convert.parseDate(${lead.Your Token Here},'yyyy-MM-dd',$locale,$inTimeZone) )
Always use simple notation unless you’re in an output context:
#set( $myDate = $convert.parseDate($lead.Your_Field_Here,'yyyy-MM-dd',$locale,$inTimeZone) )
Also, it’s not a “token” in Velocity but the Velocity field name, so I changed the snippet accordingly.
@Scott-Bush - I did the same thing for a project, and parsed the date in much smaller code. I don't mind sharing - hope this is useful! (I am not familiar with VS best practices, so I'm hoping I can learn some by sharing my code with others! All I know is that this works 😁)
#set( $inTimeZone = $date.getTimeZone().getTimeZone('America/New_York') )
#set( $outTimeZone = $date.getTimeZone().getTimeZone('America/New_York') )
#set( $locale = $date.getLocale() )
#set( $myDate = $convert.parseDate(${lead.Your Token Here},'yyyy-MM-dd',$locale,$inTimeZone) )
${date.format('MMMM dd, yyyy',$myDate,$locale,$outTimeZone)}
You shouldn’t be using formal notation here:
#set( $myDate = $convert.parseDate(${lead.Your Token Here},'yyyy-MM-dd',$locale,$inTimeZone) )
Always use simple notation unless you’re in an output context:
#set( $myDate = $convert.parseDate($lead.Your_Field_Here,'yyyy-MM-dd',$locale,$inTimeZone) )
Also, it’s not a “token” in Velocity but the Velocity field name, so I changed the snippet accordingly.
@jsiebert That DOES work and it tested fine on both a Person view and List view. I had tried your code before but was using an account field - VS seems to require a lead field so I had Sales Ops create a Contact Field that pulls the Contact.Renewal Date into a lead.Account Renewal Date field. I never re-tested with that change. Thanks for jumping in and big thanks to @SanfordWhiteman for striving with me during the holiday season. Here's the code that works for me...
#set( $inTimeZone = $date.getTimeZone().getTimeZone('America/New_York') )
#set( $outTimeZone = $date.getTimeZone().getTimeZone('America/New_York') )
#set( $locale = $date.getLocale() )
#set( $myDate = $convert.parseDate(${lead.Account Renewal Date},'yyyy-MM-dd',$locale,$inTimeZone) )
${date.format('MMMM dd, yyyy',$myDate,$locale,$outTimeZone)}
Great! I would make sure that it works when you send yourself a full e-mail (not through the 'Send Sample' capability). It should be fine, and the code works for me, but... measure twice cut once right? 😉
Also to be clear the 2 snippets are doing exactly the same thing once compiled by the Velocity engine.
The output works fine with my original fix as well.
Please remember to use the Syntax Highlighter (“Insert/Edit Code Sample”) so code is readable. I edited your post this time.
The problem is your formats don’t correctly describe your input and output.
The input is an ISO Date (yyyy-MM-dd) and your desired output doesn’t include the time, so you want:
#set( $dateOptions = {
"formats" : {
"userin" : "yyyy-MM-dd",
"userout" : "MMMM d, yyyy"
},
"timezones" : {
"userin" : "America/New_York",
"userout" : "America/New_York"
},
"locale" : $date.getLocale()
})
In a preview test, the output is $renewalDate_formatted - it didn't express the date.
Gonna need more info than that. Note you have to use Preview By List to correctly target a lead.
Please show the output of
${lead}
When I set $lead.account_renewal_date__c
to a standard ISO date (yyyy-MM-dd) the output looks fine.