[SNMP4J] 2 Bugs found in function: makeDateAndTime
Taoufik BEN EZZAHHAF
b_taoufik at yahoo.com
Fri Dec 23 15:57:35 CET 2005
Hi everybody,
In the function makeDateAndTime (package
org.snmp4j.agent.mo.snmp) below, tws problems have
been encoutred.
public static OctetString
makeDateAndTime(GregorianCalendar dateAndTime) {
OctetString os = new OctetString();
os.append((byte)(dateAndTime.get(Calendar.YEAR)/256));
os.append((byte)(dateAndTime.get(Calendar.YEAR)%256));
os.append((byte)(dateAndTime.get(Calendar.MONTH)));
os.append((byte)(dateAndTime.get(Calendar.DAY_OF_MONTH)));
os.append((byte)(dateAndTime.get(Calendar.HOUR_OF_DAY)));
os.append((byte)(dateAndTime.get(Calendar.MINUTE)));
os.append((byte)(dateAndTime.get(Calendar.SECOND)));
os.append((byte)(dateAndTime.get(Calendar.MILLISECOND)/100));
if (dateAndTime.getTimeZone() != null) {
TimeZone tz = dateAndTime.getTimeZone();
os.append((tz.getRawOffset()>=0) ? "+":"-");
os.append((byte)(tz.getRawOffset()/60000));
os.append((byte)(tz.getRawOffset()/1000));
}
return os;
}
First problem:
*************
In class Calendar the months are zero-based: January
is month 0. So to append the right month to the
OctetString returned, 1 has to be added to
dateAndTime.get(Calendar.MONTH). Which results in
doing:
os.append((byte)(dateAndTime.get(Calendar.MONTH) +
1));
Second problem:
**************
In function above, to get time zone offset in hours
(respectively minutes), you do:
if (dateAndTime.getTimeZone() != null) {
TimeZone tz = dateAndTime.getTimeZone();
os.append((tz.getRawOffset()>=0) ? "+":"-");
os.append((byte)(tz.getRawOffset()/60000));
os.append((byte)(tz.getRawOffset()/1000));
}
this gives erroneous results. To avoid this the right
processing must be:
if (dateAndTime.getTimeZone() != null) {
TimeZone tz = dateAndTime.getTimeZone();
int offset = tz.getRawOffset();
os.append((offset>=0) ? "+":"-");
os.append((byte)(Math.abs(offset)/3600000));
os.append((byte)((Math.abs(offset)%3600000)/60000));
}
The correct function will then be:
public static OctetString
makeDateAndTime(GregorianCalendar dateAndTime)
{
OctetString os = new OctetString();
os.append((byte)(dateAndTime.get(Calendar.YEAR)/256));
os.append((byte)(dateAndTime.get(Calendar.YEAR)%256));
os.append((byte)(dateAndTime.get(Calendar.MONTH) +
1));
os.append((byte)(dateAndTime.get(Calendar.DAY_OF_MONTH)));
os.append((byte)(dateAndTime.get(Calendar.HOUR_OF_DAY)));
os.append((byte)(dateAndTime.get(Calendar.MINUTE)));
os.append((byte)(dateAndTime.get(Calendar.SECOND)));
os.append((byte)(dateAndTime.get(Calendar.MILLISECOND)/100));
if (dateAndTime.getTimeZone() != null) {
TimeZone tz = dateAndTime.getTimeZone();
int offset = tz.getRawOffset();
os.append((offset>=0) ? "+":"-");
os.append((byte)(Math.abs(offset)/3600000));
os.append((byte)((Math.abs(offset)%3600000)/60000));
}
return os;
}
Hope this will help you...
Taoufik
___________________________________________________________________________
Nouveau : téléphonez moins cher avec Yahoo! Messenger ! Découvez les tarifs exceptionnels pour appeler la France et l'international.
Téléchargez sur http://fr.messenger.yahoo.com
More information about the SNMP4J
mailing list