You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2004/10/26 05:47:22 UTC
svn commit: rev 55565 - in incubator/directory/ldap/trunk/common/src: java/org/apache/ldap/common/util test/org/apache/ldap/common/util
Author: akarasulu
Date: Mon Oct 25 20:47:22 2004
New Revision: 55565
Added:
incubator/directory/ldap/trunk/common/src/java/org/apache/ldap/common/util/DateUtils.java
incubator/directory/ldap/trunk/common/src/test/org/apache/ldap/common/util/
incubator/directory/ldap/trunk/common/src/test/org/apache/ldap/common/util/DateUtilsTest.java
Log:
adding utility methods for generating generalizedTime strings
Added: incubator/directory/ldap/trunk/common/src/java/org/apache/ldap/common/util/DateUtils.java
==============================================================================
--- (empty file)
+++ incubator/directory/ldap/trunk/common/src/java/org/apache/ldap/common/util/DateUtils.java Mon Oct 25 20:47:22 2004
@@ -0,0 +1,190 @@
+/*
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.ldap.common.util;
+
+
+import java.util.Calendar;
+
+
+/**
+ * Document this class.
+ *
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+public class DateUtils
+{
+ /**
+ * Gets the generalized time using the g-differential option rather than
+ * zulu time described by [<a href=
+ * "http://ietf.org/internet-drafts/draft-ietf-ldapbis-syntaxes-09.txt">
+ * SYNTAXES</a>] section 3.3.13. We include this section below:
+ * <pre>
+ *
+ * 3.3.13. Generalized Time
+ *
+ * A value of the Generalized Time syntax is a character string
+ * representing a date and time. The LDAP-specific encoding of a value
+ * of this syntax is a restriction of the format defined in [ISO8601],
+ * and is described by the following ABNF:
+ *
+ * century = 2(%x30-39) ; "00" to "99"
+ * year = 2(%x30-39) ; "00" to "99"
+ * month = ( %x30 %x31-39 ) ; "01" (January) to "09"
+ * / ( %x31 %x30-32 ) ; "10" to "12"
+ * day = ( %x30 %x31-39 ) ; "01" to "09"
+ * / ( %x31-32 %x30-39 ) ; "10" to "29"
+ * / ( %x33 %x30-31 ) ; "30" to "31"
+ * hour = ( %x30-31 %x30-39 ) / ( %x32 %x30-33 ) ; "00" to "23"
+ * minute = %x30-35 %x30-39 ; "00" to "59"
+ * second = ( %x30-35 %x30-39 ) ; "00" to "59"
+ * / ( %x36 %x30 ) ; "60" (a leap second)
+ *
+ * GeneralizedTime = century year month day hour
+ * [ minute [ second ] ] [ fraction ]
+ * g-time-zone
+ * fraction = ( DOT / COMMA ) 1*(%x30-39)
+ * g-time-zone = %x5A ; "Z"
+ * / g-differential
+ * g-differential = ( MINUS / PLUS ) hour [ minute ]
+ * MINUS = %x2D ; minus sign ("-")
+ *
+ * The <DOT>, <COMMA> and <PLUS> rules are defined in [MODELS].
+ *
+ * The time value represents coordinated universal time (equivalent to
+ * Greenwich Mean Time) if the "Z" form of <g-time-zone> is used,
+ *
+ * otherwise the value represents a local time in the time zone
+ * indicated by <g-differential>. In the latter case, coordinated
+ * universal time can be calculated by subtracting the differential from
+ * the local time. The "Z" form of <g-time-zone> SHOULD be used in
+ * preference to <g-differential>.
+ *
+ * Examples:
+ * 199412161032Z
+ * 199412160532-0500
+ *
+ * Both example values represent the same coordinated universal time:
+ * 10:32 AM, December 16, 1994.
+ *
+ * The LDAP definition for the Generalized Time syntax is:
+ *
+ * ( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'Generalized Time' )
+ *
+ * This syntax corresponds to the GeneralizedTime ASN.1 type from
+ * [ASN.1], with the constraint that local time without a differential
+ * SHALL NOT be used.
+ * </pre>
+ *
+ * @param millis time in milliseconds to calculate the generalized time
+ * @return the generalized time using the g-differential option for
+ * the default timezone
+ */
+ public static String getGeneralizedTime( long millis )
+ {
+ StringBuffer buf = new StringBuffer();
+ Calendar cal = Calendar.getInstance();
+ cal.setTimeInMillis( millis );
+
+ // append the century and year in one shot
+ buf.append( cal.get( Calendar.YEAR ) );
+
+ /*
+ * we add one because cal uses 0 based and LDAP uses 1 based month
+ * indexing - also we need to make sure we left pad the value w/ a 0
+ */
+ int month = cal.get( Calendar.MONTH ) + 1;
+ if ( month < 10 )
+ {
+ buf.append( '0' ).append( month );
+ }
+ else
+ {
+ buf.append( month );
+ }
+
+ // we need to make sure we left pad the value w/ a 0
+ int dayOfMonth = cal.get( Calendar.DAY_OF_MONTH );
+ if ( dayOfMonth < 10 )
+ {
+ buf.append( '0' ).append( dayOfMonth );
+ }
+ else
+ {
+ buf.append( dayOfMonth );
+ }
+
+ int hourOfDay = cal.get( Calendar.HOUR_OF_DAY );
+ if ( hourOfDay < 10 )
+ {
+ buf.append( '0' ).append( hourOfDay );
+ }
+ else
+ {
+ buf.append( hourOfDay );
+ }
+
+ int minute = cal.get( Calendar.MINUTE );
+ if ( minute < 10 )
+ {
+ buf.append( '0' ).append( minute );
+ }
+ else
+ {
+ buf.append( minute );
+ }
+
+ int second = cal.get( Calendar.SECOND );
+ if ( second < 10 )
+ {
+ buf.append( '0' ).append( second );
+ }
+ else
+ {
+ buf.append( second );
+ }
+
+ // calculate the offset, the -/+ value for g-differential, and take abs
+ int offset = cal.getTimeZone().getRawOffset();
+ buf.append( offset > 0 ? '+' : '-' );
+ offset = Math.abs( offset );
+
+ // calculate the offset hours
+ int offsetHours = ( offset / 3600000 );
+ if ( offsetHours < 10 )
+ {
+ buf.append( '0' ).append( offsetHours );
+ }
+ else
+ {
+ buf.append( offsetHours );
+ }
+
+ // calculate the offset minutes
+ int offsetMinutes = ( offset / 1000 ) % 3600;
+ if ( offsetMinutes < 10 )
+ {
+ buf.append( '0' ).append( offsetMinutes );
+ }
+ else
+ {
+ buf.append( offsetMinutes );
+ }
+
+ return buf.toString();
+ }
+}
Added: incubator/directory/ldap/trunk/common/src/test/org/apache/ldap/common/util/DateUtilsTest.java
==============================================================================
--- (empty file)
+++ incubator/directory/ldap/trunk/common/src/test/org/apache/ldap/common/util/DateUtilsTest.java Mon Oct 25 20:47:22 2004
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.apache.ldap.common.util;
+
+
+import java.util.Calendar;
+import java.util.TimeZone;
+
+import junit.framework.TestCase;
+
+
+/**
+ * Tests the DateUtils class.
+ *
+ * @author <a href="mailto:directory-dev@incubator.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+public class DateUtilsTest extends TestCase
+{
+ /** message about length max being 17 chars */
+ private static final String LENGTH_MSG =
+ "All generalized time lengths with g-differential option for the " +
+ "time zone should be a length of 19 characters but we got:\n";
+
+
+ /**
+ * Tests to make sure the format and time correspond with the returned
+ * String from the {@link DateUtils#getGeneralizedTime(long)} method.
+ */
+ public void testGetGeneralizedTime()
+ {
+ String time = DateUtils.getGeneralizedTime( System.currentTimeMillis() );
+ assertEquals( LENGTH_MSG + time, 19, time.length() );
+
+ // use the example date time from the Javadocs
+ Calendar cal = Calendar.getInstance( TimeZone.getTimeZone( "UTC" ) );
+ cal.set( Calendar.YEAR, 1994 );
+ cal.set( Calendar.MONTH, 11 );
+ cal.set( Calendar.DAY_OF_MONTH, 16 );
+ cal.set( Calendar.HOUR_OF_DAY, 10 );
+ cal.set( Calendar.MINUTE, 32 );
+ cal.set( Calendar.SECOND, 07 );
+
+ time = DateUtils.getGeneralizedTime( cal.getTimeInMillis() );
+ assertEquals( "Expected the example date of 10:32 AM, " +
+ "December 16, 1994 UTC", "19941216053207-0500", time );
+ }
+}