001/* 002 * ==================================================================== 003 * Licensed to the Apache Software Foundation (ASF) under one 004 * or more contributor license agreements. See the NOTICE file 005 * distributed with this work for additional information 006 * regarding copyright ownership. The ASF licenses this file 007 * to you under the Apache License, Version 2.0 (the 008 * "License"); you may not use this file except in compliance 009 * with the License. You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, 014 * software distributed under the License is distributed on an 015 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 016 * KIND, either express or implied. See the License for the 017 * specific language governing permissions and limitations 018 * under the License. 019 * ==================================================================== 020 * 021 * This software consists of voluntary contributions made by many 022 * individuals on behalf of the Apache Software Foundation. For more 023 * information on the Apache Software Foundation, please see 024 * <http://www.apache.org/>. 025 * 026 */ 027 028package org.apache.http.protocol; 029 030import org.apache.http.annotation.ThreadingBehavior; 031import org.apache.http.annotation.Contract; 032 033import java.text.DateFormat; 034import java.text.SimpleDateFormat; 035import java.util.Date; 036import java.util.Locale; 037import java.util.TimeZone; 038 039/** 040 * Generates a date in the format required by the HTTP protocol. 041 * 042 * @since 4.0 043 */ 044@Contract(threading = ThreadingBehavior.SAFE) 045public class HttpDateGenerator { 046 047 /** Date format pattern used to generate the header in RFC 1123 format. */ 048 public static final 049 String PATTERN_RFC1123 = "EEE, dd MMM yyyy HH:mm:ss zzz"; 050 051 /** The time zone to use in the date header. */ 052 public static final TimeZone GMT = TimeZone.getTimeZone("GMT"); 053 054 private final DateFormat dateformat; 055 private long dateAsLong = 0L; 056 private String dateAsText = null; 057 058 public HttpDateGenerator() { 059 super(); 060 this.dateformat = new SimpleDateFormat(PATTERN_RFC1123, Locale.US); 061 this.dateformat.setTimeZone(GMT); 062 } 063 064 public synchronized String getCurrentDate() { 065 final long now = System.currentTimeMillis(); 066 if (now - this.dateAsLong > 1000) { 067 // Generate new date string 068 this.dateAsText = this.dateformat.format(new Date(now)); 069 this.dateAsLong = now; 070 } 071 return this.dateAsText; 072 } 073 074}