DateAndTime是Snmpv中的一种数据类型它主要提供了对日期时间的描述我在使用Snmpj开发包时发现其不提供对DateAndTime类型的支持而有时又需要用到该类型于是自己写了一个方法解析该类型可以实现对DateAndTime类型的格式化并且可以方便地提取各时间项 下面是RFC中对DateAndTime的定义 DateAndTime ::= OCTET STRING (SIZE ( | )) A datetime specification for the local time of day This data type is intended to provide a consistent method of reporting date information
field octets contents range _____ ______ ________ _____ year (in network byte order) month day hour minutes seconds (use for leapsecond) deciseconds direction from UTC + / (in ascii notation) hours from UTC minutes from UTC
Note that if only local time is known then timezone information (fields ) is not present 由定义可见DateAndTime仍然是OCTET STRING类型的数据只是对每个字节进行了具体的定义比如前两个字节表示年第五个字节表示小时等所以如果某个开发包中没有DateAndTime类型那么大可以用Octet类型去代替但是这样做得到的只是一些无意义的乱码而已因此实现的关键就在于按照定义对特殊的Octet数据进行正确的解析 既然DateAndTime也是Octet String那么我们就可以按照字节数组来处理他 import javautilVector; import orgapachelogjLogger; import orgsnmpjCommandResponderEvent; import orgsnmpjPDU; import orgsnmpjsmiOctetString; import orgsnmpjsmiVariable; import orgsnmpjsmiVariableBinding; import diationsnmpSNMPManager; import diationutilINMSLog; public class SNMPAdapter extends SNMPManager{ private Logger adapterlog = INMSLoggetInstance()getAdapterLog() private Logger recvlog = INMSLoggetInstance()getReceiveLog() public SNMPAdapter(String snmpIP String snmpPort){ super(snmpIP snmpPort) } @Override protected void notifyMsg(CommandResponderEvent event) { (Mapper::notifyMsg》 =====NOTIFY_ALarm=====) PDU pdu = eventgetPDU() Vector vec = pdugetVariableBindings() (YYWifiMapper::process》 oid size = + vecsize()) for (int i = ; i < vecsize() i++) { String oidNameValue = ; VariableBinding vb = (VariableBinding)vecget(i) if (vbgetVariable() instanceof OctetString) { String value = new String(((OctetString)vbgetVariable())getValue()) if(vbgetOid()toString()trim()equals() ){ oidNameValue = OID:+vbgetOid()+\t+value: + parseDateAndTime(vbgetVariable()) } else{ oidNameValue = OID:+vbgetOid()+\t+value: + valuetrim() } } else{ //略 } } } public String parseDateAndTime(Variable v){ (YYWifiMapper::parseDateAndTime》 v=+v) // (YYWifiMapper::parseDateAndTime》 v string=+vtoString()) OctetString oct = (OctetString)v; // (YYWifiMapper::parseDateAndTime》 v hex=+ octtoHexString()) byte[] bts = octgetValue() byte[] format_str = new byte[]; //保存格式化过后的时间字符串 int year; int month; int day; int hour; int minute; int second; int msecond; // for(byte b:bts){ // (YYWifiMapper::parseDateAndTime》 bts:+b) // } year=bts[]*++bts[]; //(YYWifiMapper::parseDateAndTime》 year:+year) month=bts[]; day=bts[]; hour=bts[]; minute=bts[]; second=bts[]; msecond=bts[]; //以下为格式化字符串 int index=; int temp=year; for( index>=; index){ format_str[index]=(byte)(+(temptemp/*)) temp/=; } format_str[]=; index=; temp=month; for( index>=; index){ format_str[index]=(byte)(+(temptemp/*)) temp/=; } format_str[]=; index=; temp=day; for( index>=; index){ format_str[index]=(byte)(+(temptemp/*)) temp/=; } format_str[]= ; index=; temp=hour; for( index>=; index){ format_str[index]=(byte)(+(temptemp/*)) temp/=; } format_str[]=:; index=; temp=minute; for( index>=; index){ format_str[index]=(byte)(+(temptemp/*)) temp/=; } format_str[]=:; index=; temp=second; for( index>=; index){ format_str[index]=(byte)(+(temptemp/*)) temp/=; } // format_str[]=; // index=; // temp=msecond; // for( index>=; index){ // format_str[index]=(byte)(+(temptemp/*)) // temp/=; // } // // format_str[]=; // (YYWifiMapper::parseDateAndTime》 format_str = + new String(format_str)) return new String(format_str) } } 实际运行log如下(注意值为进制) YYWifiMapper::parseDateAndTime》 v=:dc:::::b::b:: YYWifiMapper::parseDateAndTime》 format_str = :: 处理年的时候稍有不同因为年是由两个字节表示所以要用高位字节乘再加低位字节处理语句为year=bts[]*++bts[];标准的时间输出格式应该为YYYYMMDD HH:MM:SS形式 其实自己用计算器就能算出时间很简单了 主要是年的计算byte是可以为负值所以手动计算的公式 * + dc = * + = 年或者* + ( + dc) = * + ( + ()) = 年 = 月 = 日 = 时 = 分 b = 秒 |