src.com.ibm.as400.access.DateTimeConverter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jt400-jdk8 Show documentation
Show all versions of jt400-jdk8 Show documentation
The Open Source version of the IBM Toolbox for Java
The newest version!
///////////////////////////////////////////////////////////////////////////////
//
// JTOpen (IBM Toolbox for Java - OSS version)
//
// Filename: DateTimeConverter.java
//
// The source code contained herein is licensed under the IBM Public License
// Version 1.0, which has been approved by the Open Source Initiative.
// Copyright (C) 1997-2004 International Business Machines Corporation and
// others. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
// 2008-05-21 @A1 Changes for *CURRENT when returning Date objects. Adjust the
// AS400 system time to the local client time.
///////////////////////////////////////////////////////////////////////////////
package com.ibm.as400.access;
import java.beans.PropertyVetoException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;
import java.util.Date;
import java.util.Hashtable; //@CAA
import java.util.TimeZone; //@A1A
/**
A utility for converting date/time values.
The system API QWCCVTDT is used to convert a date and time value
from one format to another format.
@see AS400Date
@see AS400Time
@see AS400Timestamp
**/
public class DateTimeConverter
{
private AS400 system_;
private ProgramCall program_;
private AS400Text text10_;
private Calendar calendar_;
//private Calendar calendarGMT_;
private DateTime17Format format17_;
//private DateTime16Format format16_;
private TimeZone systemTimeZone_; // the time zone for the IBM i server
/**
* Constructs a DateTimeConverter object.
* @param system The system.
**/
public DateTimeConverter(AS400 system)
{
if (system == null)
throw new NullPointerException("system");
system_ = system;
program_ = new ProgramCall(system_);
text10_ = new AS400Text(10, system_.getCcsid(), system_);
///format17_ = new DateTime17Format(system_);
//format16_ = new DateTime16Format(system_);
}
/**
* Converts date and time values from the input format to the requested output format.
* The system API QWCCVTDT (Convert Date and Time Format) is called to perform the conversion.
* This method effectively just re-arranges the time format and returns it.
* The input and output values are relative to the same time zone.
* Therefore, no adjustments are made based on time-zone.
*
* @param data The date and time value to be converted.
* @param inFormat The input date and time format.
* Possible values are:
- *CURRENT
- *DTS
- *JOB
- *SYSVAL
- *YMD
- *YYMD
- *MDY
- *MDYY
- *DMY
- *DMYY
- *JUL
- *LONGJUL
* @param outFormat The output date and time format.
* Possible values are:
- *DTS
- *JOB
- *SYSVAL
- *YMD
- *YYMD
- *MDY
- *MDYY
- *DMY
- *DMYY
- *JUL
- *LONGJUL
- *DOS
* @return The converted date and time value, left-justified in the array.
* Refer to the specification for the QWCCVTDT API to determine how many of the
* returned bytes are meaningful.
*
* @exception AS400SecurityException If a security or authority error
* occurs.
* @exception ErrorCompletingRequestException If an error occurs before
* the request is completed.
* @exception InterruptedException If this thread is interrupted.
* @exception IOException If an error occurs while communicating with
* the system.
* @exception ObjectDoesNotExistException If the object does not exist on the system.
**/
public byte[] convert(byte[] data, String inFormat, String outFormat)
throws AS400SecurityException,
ErrorCompletingRequestException,
InterruptedException,
IOException,
ObjectDoesNotExistException
{
return convert(data, inFormat, outFormat, null);
}
private byte[] convert(byte[] data, String inFormat, String outFormat, String timezone)
throws AS400SecurityException,
ErrorCompletingRequestException,
InterruptedException,
IOException,
ObjectDoesNotExistException
{
if (data == null) throw new NullPointerException("data");
if (inFormat == null) throw new NullPointerException("inFormat");
if (outFormat == null) throw new NullPointerException("outFormat");
// Set up the parameters.
// Design note: We don't need to use the optional parms, since we're not converting between different time zones.
ProgramParameter[] parmList;
if (timezone == null) {
parmList = new ProgramParameter[5];
setRequiredParameters(parmList, data, inFormat, outFormat);
}
else {
parmList = new ProgramParameter[10];
setRequiredParameters(parmList, data, inFormat, outFormat);
setOptionalParameters(parmList, timezone);
}
// Set the program name and parameter list
try
{
program_.setProgram("/QSYS.LIB/QWCCVTDT.PGM", parmList);
}
catch(PropertyVetoException pve) {} // Quiet the compiler
program_.suggestThreadsafe(); //@A2A
// Run the program
if (!program_.run())
{
// Note that there was an error
Trace.log(Trace.ERROR, "DateTimeConverter call to QWCCVTDT failed.");
// Show the messages
AS400Message[] messageList = program_.getMessageList();
for (int i=0; iQWCCVTDT (Convert Date and Time Format) is called to perform the conversion.
* @param data The date and time value to be converted.
* The value is assumed to be relative to the IBM i system's time zone.
* @param inFormat The format of the date and time value being provided.
* Possible values are:
- *CURRENT
- *DTS
- *JOB
- *SYSVAL
- *YMD
- *YYMD
- *MDY
- *MDYY
- *DMY
- *DMYY
- *JUL
- *LONGJUL
* Note: When *CURRENT is specified, the data parameter is disregarded.
* @return The converted date and time.
* @exception AS400SecurityException If a security or authority error
* occurs.
* @exception ErrorCompletingRequestException If an error occurs before
* the request is completed.
* @exception InterruptedException If this thread is interrupted.
* @exception IOException If an error occurs while communicating with
* the system.
* @exception ObjectDoesNotExistException If the object does not exist on the system.
**/
public Date convert(byte[] data, String inFormat)
throws AS400SecurityException,
ErrorCompletingRequestException,
InterruptedException,
IOException,
ObjectDoesNotExistException
{
if (data == null) throw new NullPointerException("data");
if (inFormat == null) throw new NullPointerException("inFormat");
// Use output format *YYMD which gives us a full Date: YYYYMMDD.
byte[] converted = convert(data, inFormat, "*YYMD", null); // call QWCCVTDT
Record rec = getFormat17().getNewRecord(converted);
if (Trace.traceOn_)
{
Trace.log(Trace.DIAGNOSTIC, "DateTimeConverter record parsed from bytes: "+rec.toString());
}
Calendar calendar = getCalendar();
calendar.set(Integer.parseInt(((String)rec.getField("year")).trim()),
Integer.parseInt(((String)rec.getField("month")).trim())-1,
Integer.parseInt(((String)rec.getField("day")).trim()),
Integer.parseInt(((String)rec.getField("hour")).trim()),
Integer.parseInt(((String)rec.getField("minute")).trim()),
Integer.parseInt(((String)rec.getField("second")).trim()));
calendar.set(Calendar.MILLISECOND, Integer.parseInt(((String)rec.getField("millisecond")).trim()));
return calendar.getTime();
}
// For testing and/or future enhancement:
// /**
// * Returns a converted Date object, relative to the GMT time zone.
// * The system API QWCCVTDT (Convert Date and Time Format) is called to perform the conversion.
// * @param data The date and time value to be converted.
// * The value is assumed to be relative to the IBM i system's time zone.
// * @param inFormat The format of the date and time value being provided.
// * Possible values are:
//
// - *CURRENT
//
- *DTS
//
- *JOB
//
- *SYSVAL
//
- *YMD
//
- *YYMD
//
- *MDY
//
- *MDYY
//
- *DMY
//
- *DMYY
//
- *JUL
//
- *LONGJUL
//
// * Note: When *CURRENT is specified, the data parameter is disregarded.
// * @return The converted date and time.
// * @exception AS400SecurityException If a security or authority error
// * occurs.
// * @exception ErrorCompletingRequestException If an error occurs before
// * the request is completed.
// * @exception InterruptedException If this thread is interrupted.
// * @exception IOException If an error occurs while communicating with
// * the system.
// * @exception ObjectDoesNotExistException If the object does not exist on the system.
// **/
// public Date convertGMT(byte[] data, String inFormat)
// throws AS400SecurityException,
// ErrorCompletingRequestException,
// InterruptedException,
// IOException,
// ObjectDoesNotExistException
// {
// if (data == null) throw new NullPointerException("data");
// if (inFormat == null) throw new NullPointerException("inFormat");
//
// // Use output format *YYMD which gives us a full Date: YYYYMMDD.
// byte[] converted = convert(data, inFormat, "*YYMD", "*UTC"); // call QWCCVTDT
// Record rec = getFormat17().getNewRecord(converted);
//
// if (Trace.traceOn_)
// {
// Trace.log(Trace.DIAGNOSTIC, "DateTimeConverter record parsed from bytes: "+rec.toString());
// }
//
// Calendar calendar = getCalendarGMT();
// calendar.set(Integer.parseInt(((String)rec.getField("year")).trim()),
// Integer.parseInt(((String)rec.getField("month")).trim())-1,
// Integer.parseInt(((String)rec.getField("day")).trim()),
// Integer.parseInt(((String)rec.getField("hour")).trim()),
// Integer.parseInt(((String)rec.getField("minute")).trim()),
// Integer.parseInt(((String)rec.getField("second")).trim()));
// calendar.set(Calendar.MILLISECOND, Integer.parseInt(((String)rec.getField("millisecond")).trim()));
//
// return calendar.getTime();
// }
/**
* Returns the converted date and time in a byte array.
* @param date The Date object to be converted.
* @param outFormat The format of the returned date and time value.
* Possible values are:
- *DTS
- *JOB
- *SYSVAL
- *YMD
- *YYMD
- *MDY
- *MDYY
- *DMY
- *DMYY
- *JUL
- *LONGJUL
* @return The converted date and time value, left-justified in the array.
* The context of the value is the IBM i system's time zone.
* Refer to the specification for the QWCCVTDT API to determine how many of the
* returned bytes are meaningful.
*
* @exception AS400SecurityException If a security or authority error
* occurs.
* @exception ErrorCompletingRequestException If an error occurs before
* the request is completed.
* @exception InterruptedException If this thread is interrupted.
* @exception IOException If an error occurs while communicating with
* the system.
* @exception ObjectDoesNotExistException If the object does not exist on the system.
**/
public byte[] convert(Date date, String outFormat)
throws AS400SecurityException,
ErrorCompletingRequestException,
InterruptedException,
IOException,
ObjectDoesNotExistException
{
if (date == null) throw new NullPointerException("date");
if (outFormat == null) throw new NullPointerException("outFormat");
byte[] data = dateToBytes(date);
return convert(data, "*YYMD", outFormat, null);
}
// For testing and/or future enhancement:
// /**
// * Returns the converted date and time in a byte array, relative to the GMT time zone.
// * @param date The Date object to be converted.
// * @param outFormat The format of the returned date and time value.
// * Possible values are:
//
// - *DTS
//
- *JOB
//
- *SYSVAL
//
- *YMD
//
- *YYMD
//
- *MDY
//
- *MDYY
//
- *DMY
//
- *DMYY
//
- *JUL
//
- *LONGJUL
//
// * @return The converted date and time value, left-justified in the array.
// * The context of the value is the GMT time zone.
// * Refer to the specification for the QWCCVTDT API to determine how many of the
// * returned bytes are meaningful.
// *
// * @exception AS400SecurityException If a security or authority error
// * occurs.
// * @exception ErrorCompletingRequestException If an error occurs before
// * the request is completed.
// * @exception InterruptedException If this thread is interrupted.
// * @exception IOException If an error occurs while communicating with
// * the system.
// * @exception ObjectDoesNotExistException If the object does not exist on the system.
// **/
// public byte[] convertGMT(Date date, String outFormat)
// throws AS400SecurityException,
// ErrorCompletingRequestException,
// InterruptedException,
// IOException,
// ObjectDoesNotExistException
// {
// if (date == null) throw new NullPointerException("date");
// if (outFormat == null) throw new NullPointerException("outFormat");
//
// byte[] data = dateToBytes(date);
// return convert(data, "*YYMD", outFormat, "*UTC"); // "*UTC" == GMT timezone
// }
// Converts a Date value to an IBM i byte sequence in *YYMD format.
private byte[] dateToBytes(Date date)
throws AS400SecurityException,
ErrorCompletingRequestException,
InterruptedException,
IOException,
ObjectDoesNotExistException
{
Calendar calendar = getCalendar();
calendar.setTime(date);
// Start with *YYMD for conversion. Seems like a good format to use.
Record rec = getFormat17().getNewRecord();
rec.setField("year", Integer.toString(calendar.get(Calendar.YEAR)));
// Need to pad each number with 0s if necessary, so it will fill the format
int month = calendar.get(Calendar.MONTH)+1;
String monthStr = (month < 10 ? "0" : "") + month;
rec.setField("month", monthStr);
int day = calendar.get(Calendar.DAY_OF_MONTH);
String dayStr = (day < 10 ? "0" : "") + day;
rec.setField("day", dayStr);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
String hourStr = (hour < 10 ? "0" : "") + hour;
rec.setField("hour", hourStr);
int minute = calendar.get(Calendar.MINUTE);
String minuteStr = (minute < 10 ? "0" : "") + minute;
rec.setField("minute", minuteStr);
int second = calendar.get(Calendar.SECOND);
String secondStr = (second < 10 ? "0" : "") + second;
rec.setField("second", secondStr);
int ms = calendar.get(Calendar.MILLISECOND);
String msStr = (ms < 100 ? "0" : "") + (ms < 10 ? "0" : "") + ms;
rec.setField("millisecond", msStr);
if (Trace.traceOn_)
{
Trace.log(Trace.DIAGNOSTIC, "DateTimeConverter record parsed from Date: "+rec.toString());
}
return rec.getContents();
}
// Utility method.
// Returns a Calendar object for the current system, set to the IBM i system's time zone.
private final Calendar getCalendar()
throws AS400SecurityException,
ErrorCompletingRequestException,
InterruptedException,
IOException,
ObjectDoesNotExistException
{
if (calendar_ == null) {
// Create a Calendar object, based in the system's time zone.
calendar_ = AS400Calendar.getGregorianInstance(getSystemTimeZone());
}
else calendar_.clear();
return calendar_;
}
// For testing and/or future enhancement:
// // Utility method.
// // Returns a Calendar object set to the GMT time zone.
// private final Calendar getCalendarGMT()
// {
// if (calendarGMT_ == null) {
// // Create a Calendar object, based in the GMT time zone.
// calendarGMT_ = AS400Calendar.getGregorianInstance(TimeZone.getTimeZone("GMT-0"));
// }
// else calendarGMT_.clear();
// return calendarGMT_;
// }
// Utility method.
private synchronized DateTime17Format getFormat17()
{
if (format17_ == null) {
format17_ = new DateTime17Format(system_);
}
return format17_;
}
/**
* Returns a TimeZone object to represent the time zone for the system.
* The TimeZone object will have the correct UTC offset for the system.
* @return A TimeZone object representing the system's configured time zone setting.
* @exception AS400SecurityException If a security or authority error
* occurs.
* @exception ErrorCompletingRequestException If an error occurs before
* the request is completed.
* @exception InterruptedException If this thread is interrupted.
* @exception IOException If an error occurs while communicating with
* the system.
* @exception ObjectDoesNotExistException If the API used to retrieve the information does not exist on the system.
**/
final TimeZone getSystemTimeZone()
throws AS400SecurityException,
ErrorCompletingRequestException,
InterruptedException,
IOException,
ObjectDoesNotExistException
{
if (systemTimeZone_ == null) {
systemTimeZone_ = timeZoneForSystem(system_);
}
return systemTimeZone_;
}
//
// These are the values shipped with the system.
// See http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=/rzati/rzatitimezone.htm
// @CAA
static String iTimeZoneTojavaTimeZoneMapping[][] = {
{"Q0000UTC","UTC"},
{"Q0000GMT","GMT"},
{"Q0000GMT2","Europe/London"},
{"Q000GMT3","Europe/London"},
{"QN0100UTCS","GMT-1"},
{"QN0200UTCS","GMT-2"},
{"QN0300UTCS","GMT-3"},
{"QN0300UTC2","America/Sao_Paulo"},
{"QN0330NST","America/St_Johns"},
{"QN0330NST2","America/St_Johns"},
{"QN0330NST3","America/St_Johns"},
{"QN0330NST4","America/St_Johns"},
{"QN0400UTCS","GMT-4"},
{"QN0400AST","Atlantic/Bermuda"},
{"QN0400AST2","Atlantic/Bermuda"},
{"QN0400CLT","America/Santiago"},
{"QN0400UTC2","America/Caracas"},
{"QN0500UTCS","GMT-5"},
{"QN0500EST","America/New_York"},
{"QN0500EST2","GMT-5"},
{"QN0500EST3","America/New_York"},
{"QN0600UTCS","GMT-6"},
{"QN0600CST","America/Chicago"},
{"QN0600CST2","America/Chicago"},
{"QN0600CST3","America/Mexico_City"},
{"QN0600S","America/Chicago"},
{"QN0700UTCS","GMT-7"},
{"QN0700MST","America/Denver"},
{"QN0700MST2","America/Phoenix"},
{"QN0700MST3","America/Denver"},
{"QN0700MST4","America/Mazatlan"},
{"QN0700T","America/Denver"},
{"QN0800UTCS","GMT-8"},
{"QN0800PST","America/Los_Angeles"},
{"QN0800PST2","America/Los_Angeles"},
{"QN0800PST3","America/Tijuana"},
{"QN0800U","America/Los_Angeles"},
{"QN0900UTCS","GMT-9"},
{"QN0900AST","America/Anchorage"},
{"QN0900AST2","America/Anchorage"},
{"QN1000UTCS","GMT-10"},
{"QN1000HAST","America/Adak"},
{"QN1000HAS2","America/Adak"},
{"QN1000HST","Pacific/Honolulu"},
{"QN1100UTCS","GMT-11"},
{"QN1200UTCS","GMT-12"},
{"QP1245UTCS","Pacific/Chatham"},
{"QP1245UTC2","Pacific/Chatham"},
{"QP1200UTCS","GMT+12"},
{"QP1200NZST","Pacific/Auckland"},
{"QP1200NZS2","Pacific/Auckland"},
{"QP1200NZS3","Pacific/Auckland"},
{"QP1100UTCS","GMT+11"},
{"QP1000UTCS","GMT+10"},
{"QP1000AEST","Australia/Sydney"},
{"QP1000AES2","Australia/Sydney"},
{"QP0930ACST","Australia/Adelaide"},
{"QP0930ACS2","Australia/Adelaide"},
{"QP0900UTCS","GMT+9"},
{"QP0900JST","Asia/Tokyo"},
{"QP0900KST","Asia/Seoul"},
{"QP0900WIT","Asia/Jayapura"},
{"QP0800UTCS","GMT+8"},
{"QP0800AWST","Australia/Perth"},
{"QP0800AWS2","Australia/Perth"},
{"QP0800AWS3","Australia/Perth"},
{"QP0800BST","Asia/Shanghai"},
{"QP0800JIST","Asia/Hong_Kong"},
{"QP0800WITA","Asia/Ujung_Pandang"},
{"QP0700UTCS","GMT+7"},
{"QP0700WIB","Asia/Jakarta"},
{"QP0600UTCS","GMT+6"},
{"QP0600UTC2","Asia/Almaty"},
{"QP0600UTC3","Asia/Almaty"},
{"QP0530IST","Asia/Calcutta"},
{"QP0500UTCS","GMT+5"},
{"QP0500UTC2","Asia/Aqtobe"},
{"QP0500UTC3","Asia/Aqtobe"},
{"QP0400UTCS","GMT+4"},
{"QP0400UTC2","Asia/Aqtau"},
{"QP0400UTC3","Asia/Aqtau"},
{"QP0300MSK","Europe/Moscow"},
{"QP0300UTCS","GMT+3"},
{"QP0200UTCS","GMT+2"},
{"QP0200EET","Europe/Tallinn"},
{"QP0200EET2","GMT+2"},
{"QP0200EET3","Europe/Tallinn"},
{"QP0200SAST","Africa/Johannesburg"},
{"QP0100UTCS","GMT+1"},
{"QP0100CET","Europe/Zurich"},
{"QP0100CET2","Europe/Zurich"},
{"QP0100CET3","Europe/Zurich"},
{"QP0100CET4","Europe/Zurich"},
};
static Hashtable iTimeZoneToJavaTimeZoneHash = null;
/**
* Returns the name of the java timezone corresponding to the IBM i timezone.
*/
static String iTimeZoneToJavaTimeZone(String iTimeZone) {
iTimeZone = iTimeZone.toUpperCase();
synchronized(iTimeZoneTojavaTimeZoneMapping) {
if (iTimeZoneToJavaTimeZoneHash == null) {
iTimeZoneToJavaTimeZoneHash = new Hashtable();
for (int i = 0; i < iTimeZoneTojavaTimeZoneMapping.length; i++) {
iTimeZoneToJavaTimeZoneHash.put(iTimeZoneTojavaTimeZoneMapping[i][0],iTimeZoneTojavaTimeZoneMapping[i][1]);
}
}
}
return (String) iTimeZoneToJavaTimeZoneHash.get(iTimeZone);
}
/**
* Returns a TimeZone object to represent the time zone for the specified system.
* The TimeZone object will have the correct UTC offset for the system.
* @param system The IBM i system.
* @return A TimeZone object representing the time zone for the system.
* @exception AS400SecurityException If a security or authority error
* occurs.
* @exception ErrorCompletingRequestException If an error occurs before
* the request is completed.
* @exception InterruptedException If this thread is interrupted.
* @exception IOException If an error occurs while communicating with
* the system.
* @exception ObjectDoesNotExistException If the API used to retrieve the information does not exist on the system.
* @see AS400#getTimeZone()
**/
public static TimeZone timeZoneForSystem(AS400 system)
throws AS400SecurityException,
ErrorCompletingRequestException,
InterruptedException,
IOException,
ObjectDoesNotExistException
{
// Using the UTC offset does not properly account for the use of daylight savings time. We use
// the QTIMZON value to adjust for those areas that use daylight savings time.
//
try {
SystemValue sv = new SystemValue(system, "QTIMZON");
String iTimeZone = ((String)sv.getValue()).trim(); // returns a value such as "-0500" @7XC
String javaTimeZoneName = iTimeZoneToJavaTimeZone(iTimeZone);
if (javaTimeZoneName != null) {
return TimeZone.getTimeZone(javaTimeZoneName);
}
} catch (Exception e) {
// Log the exception and continue
Trace.log(Trace.ERROR, e);
}
// If the new method does not work, fall back to the old method of getting the timezone.
// To obtain a standard ID for the time zone, simply concatenate "GMT" and the QUTCOFFSET value.
String utcOffset = null;
try
{
SystemValue sv = new SystemValue(system, "QUTCOFFSET");
utcOffset = (String)sv.getValue(); // returns a value such as "-0500"
if (utcOffset == null || utcOffset.length() == 0)
{
if (Trace.traceOn_) {
Trace.log(Trace.DIAGNOSTIC, "QUTCOFFSET is not set. Assuming server is in the same time zone as client application.");
}
return TimeZone.getDefault();
}
else return TimeZone.getTimeZone("GMT" + utcOffset);
}
catch (RequestNotSupportedException e) // this won't happen
{ // ... but if it does happen, trace it and rethrow as a runtime exception
Trace.log(Trace.ERROR, e);
throw new InternalErrorException(InternalErrorException.UNEXPECTED_EXCEPTION, e);
}
catch (RuntimeException e)
{
// Note: We've observed the following error during testing:
// java.lang.NullPointerException at java.util.TimeZone.parseCustomTimeZone()
if (Trace.traceOn_) {
Trace.log(Trace.WARNING, "["+e.toString()+"] Unable to determine time zone of system. " +
"QUTCOFFSET value is " + utcOffset + ". " +
"Assuming server is in the same time zone as client application.");
}
return TimeZone.getDefault();
}
}
// Utility method, for use by other Toolbox classes.
// Trims-down a QWCCVTDT-generated EBCDIC date string, for use in a CL command parameter.
// Depending on the specified format, this method strips extra leading and trailing digits that aren't expected by CL commands.
static final String formatDateForCommandParameter(byte[] dateBytes, String dateFormat)
throws UnsupportedEncodingException
{
int expectedLength = 0;
String outVal = null;
// Convert EBCDIC characters to a Unicode String.
final String dateString = CharConverter.byteArrayToString(37, dateBytes);
if (dateFormat.equals("*DTS")) expectedLength = 8;
else if (dateFormat.equals("*YYMD") ||
dateFormat.equals("*MDYY") ||
dateFormat.equals("*DMYY") ||
dateFormat.equals("*LONGJUL"))
{
expectedLength = 17; // for details, refer to the API spec for QWCCVTDT
}
else if (dateFormat.equals("*MDY") ||
dateFormat.equals("*YMD") ||
dateFormat.equals("*DMY"))
{
// For these formats, CL commands expect 6 digits, with no leading "century guard digit".
outVal = dateString.substring(1,7);
}
else if (dateFormat.equals("*JUL"))
{
// For *JUL, CL commands expect 5 digits, with no leading "century guard digit".
outVal = dateString.substring(1,6);
}
else
{
expectedLength = 16; // for details, refer to the API spec for QWCCVTDT
}
if (outVal != null) return outVal;
else
{
if (dateString.length() == expectedLength) return dateString; // no truncation needed
else return dateString.substring(0,expectedLength); // truncate extra trailing digits
}
}
/**
* Specifies the 17-byte character date and time value format returned
* on the QWCCVTDT API.
**/
private static class DateTime17Format extends RecordFormat
{
private static final long serialVersionUID = 1L;
DateTime17Format(AS400 system)
{
int ccsid = system.getCcsid();
AS400Text text2 = new AS400Text(2, ccsid, system);
addFieldDescription(new CharacterFieldDescription(new AS400Text(4, ccsid, system), "year"));
addFieldDescription(new CharacterFieldDescription(text2, "month"));
addFieldDescription(new CharacterFieldDescription(text2, "day"));
addFieldDescription(new CharacterFieldDescription(text2, "hour"));
addFieldDescription(new CharacterFieldDescription(text2, "minute"));
addFieldDescription(new CharacterFieldDescription(text2, "second"));
addFieldDescription(new CharacterFieldDescription(new AS400Text(3, ccsid, system), "millisecond"));
}
}
// /**
// * Specifies the 16-byte character date and time value format returned
// * on the QWCCVTDT API.
//**/
//private static class DateTime16Format extends RecordFormat
//{
// DateTime16Format(AS400 system)
// {
// int ccsid = system.getCcsid();
// AS400Text text2 = new AS400Text(2, ccsid, system);
// addFieldDescription(new CharacterFieldDescription(new AS400Text(1, ccsid, system), "century"));
// addFieldDescription(new CharacterFieldDescription(text2, "year"));
// addFieldDescription(new CharacterFieldDescription(text2, "month"));
// addFieldDescription(new CharacterFieldDescription(text2, "day"));
// addFieldDescription(new CharacterFieldDescription(text2, "hour"));
// addFieldDescription(new CharacterFieldDescription(text2, "minute"));
// addFieldDescription(new CharacterFieldDescription(text2, "second"));
// addFieldDescription(new CharacterFieldDescription(new AS400Text(3, ccsid, system), "millisecond"));
// }
//}
}