Continuing on in the Code This, Not That series, I’m going to point out some convenient functions for formatting dates. Since Jython runs in the JVM, we get easy access to all of the libraries that the rich Java programming language provides.
Working with FDMEE and custom scripting, it’s likely that you’re going to need to do some work with dates. This will often involve the Java “Date” object. You might find that you need to do something with the date – get the year, get the name of the month, create a string based on the day of the month, and so on. First off, there are a few things you definitely don’t want to do.
One, you don’t want to convert the date object to a string and then start doing string manipulation on them to get the data you want. If you are converting some VBScript code you might be tempted to do something like
Year = RIGHT(someDate, 4). This can work but it’s a bit of a hack. What you want to do is work with the date object directly and get some other tried and true code to do the heavy lifting for you.
There are other ways to achieve this, but a pretty simple and robust one is the SimpleDateFormat class. The SimpleDateFormat class allows us to specify a formatting code, then supply it a Date object, and it’ll generate a string for us.
For example, the formatting code for the abbreviation for the month of a date object is “MMM”. Therefore, we can create a SimpleDateFormat object with this code, pass it a date, and the resulting string is Mar or Apr or whatever the current month is:
import java.text.SimpleDateFormat as Sdf import java.lang.System as System import java.sql.Date as Date date = Date(System.currentTimeMillis()) monthShortName = Sdf('MMM') print monthShortName.format(date) # prints "Mar" (or whatever the current month is)
There are plenty of other codes that take care of formatting the minutes, hours, seconds, year, and more for us. We can even combine codes in a single string, like the following:
dateFolder = Sdf('yyyyMMdd') print dateFolder.format(date)
In this case, the format is the four digit year, followed immediately by the two digit month (including a leading zero if it’s less than 10), and the two digit day. You can refer to Oracle’s documentation for more codes over here. You can also put in other characters that might be ignored in the formatting string, such as hyphens between codes, colons, spaces, and more.
Also keep in mind that you create the formatting object and use it as many times as you want to format dates into strings. In other words, if for some reason you need to format many dates into strings using the same format, you just have to create one SimpleDateFormat object and then just use it over and over again.
As I mentioned, there are plenty of ways to go about formatting dates in Java (Jython) but this is a particularly flexible and useful approach. With just a few lines of code you can generate all sorts of formats that you might need. Consider this an FDMEE/Jython pattern – and anti-patterns to this might include the following code situations you can cleanup and make more readable:
- Treating dates like strings and extracting data via substrings
- Prefixing “20” on a two-digit year to get a four digit year
- Keeping a table of month names in an array and using the month number to get the proper month name
- Keeping a table of month names and then taking the first three characters to get the “short” month name
Lastly, note that the
fdmContext["PERIODKEY"] object (which is where you are likely to be doing some date processing) comes in as a java Date object (in other words, if you are treating it as a string object, you are actually relying on the Jython interpreter silently casting it to a string for you, when you could just be working with it directly). For example, to get the numeric four digit year from the PERIODKEY object, you could do this:
# Note the explicit conversion to an integer year = int(Sdf('yyyy').format(fdmContext["PERIODKEY"]))
We are in the process of converting our HFM Batch Load VBScript to jython. Is there a document that shows for this VB API use this Jython? similar to your (code this, not that).
set BATCHENG = CreateObject(“upsWBatchLoaderDM.clsBatchLoader”)
BATCHENG.mInitialize API, SCRIPTENG
strBatchPath = API.DataWindow.Connection.PstDirInbDirInbox ….. etc.
I believe there are some documents out on the internet as well as part of the Oracle documentation that contain some equivalents in Jython for many of the things in VBScript, so I would check out the Oracle documentation first. There’s no way to translate line for line – nor would you want to.
My approach for converting VB to Jython is to simply understand what the VB is doing in terms of processing, then try to find the simplest approach that will get the same thing done in Jython – and very often I am able to reduce the size of the code significantly… although each case will be different.