ttomcat-1778514358873.zip-extract/apache-tomcat-11.0.18-src/java/org/apache/catalina/util/Strftime.java

Path
ttomcat-1778514358873.zip-extract/apache-tomcat-11.0.18-src/java/org/apache/catalina/util/Strftime.java
Status
scanned
Type
file
Name
Strftime.java
Extension
.java
Programming language
Java
Mime type
text/plain
File type
ASCII text, with CRLF line terminators
Tag

      
    
Rootfs path

      
    
Size
9135 (8.9 KB)
MD5
0d4b17dde828101a1dec91d2f1d44893
SHA1
e1d1f372a59d3675859eb0a44ad64c94870fe192
SHA256
a85b7c0ddd4d4abcc434a1512f6e5df834f27a7f82b221355c22b33607a1ffcb
SHA512

      
    
SHA1_git
68980052529e815b09b8f2c88ef8a0d6433ce60d
Is binary

      
    
Is text
True
Is archive

      
    
Is media

      
    
Is legal

      
    
Is manifest

      
    
Is readme

      
    
Is top level

      
    
Is key file

      
    
Strftime.java | 8.9 KB |

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.catalina.util; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.Properties; import java.util.TimeZone; /** * Converts dates to strings using the same format specifiers as strftime Notes: * <ul> * <li>This does not mimic strftime perfectly. Certain strftime commands, are not supported, and will convert as if they * were literals.</li> * <li>Certain complicated commands, like those dealing with the week of the year probably don't have exactly the same * behavior as strftime.</li> * <li>These limitations are due to use SimpleDateTime. If the conversion was done manually, all these limitations could * be eliminated.</li> * <li>The interface looks like a subset of DateFormat. Maybe someday someone will make this class extend * DateFormat.</li> * </ul> */ public class Strftime { protected static final Properties translate; protected final SimpleDateFormat simpleDateFormat; /* * Initialize our pattern translation */ static { translate = new Properties(); translate.put("a", "EEE"); translate.put("A", "EEEE"); translate.put("b", "MMM"); translate.put("B", "MMMM"); translate.put("c", "EEE MMM d HH:mm:ss yyyy"); // There's no way to specify the century in SimpleDateFormat. We don't want to hard-code // 20 since this could be wrong for the pre-2000 files. // translate.put("C", "20"); translate.put("d", "dd"); translate.put("D", "MM/dd/yy"); translate.put("e", "dd"); // will show as '03' instead of ' 3' translate.put("F", "yyyy-MM-dd"); translate.put("g", "yy"); translate.put("G", "yyyy"); translate.put("H", "HH"); translate.put("h", "MMM"); translate.put("I", "hh"); translate.put("j", "DDD"); translate.put("k", "HH"); // will show as '07' instead of ' 7' translate.put("l", "hh"); // will show as '07' instead of ' 7' translate.put("m", "MM"); translate.put("M", "mm"); translate.put("n", " "); translate.put("p", "a"); translate.put("P", "a"); // will show as pm instead of PM translate.put("r", "hh:mm:ss a"); translate.put("R", "HH:mm"); // There's no way to specify this with SimpleDateFormat // translate.put("s","seconds since epoch"); translate.put("S", "ss"); translate.put("t", " "); translate.put("T", "HH:mm:ss"); // There's no way to specify this with SimpleDateFormat // translate.put("u","day of week ( 1-7 )"); // There's no way to specify this with SimpleDateFormat // translate.put("U","week in year with first Sunday as first day..."); translate.put("V", "ww"); // I'm not sure this is always exactly the same // There's no way to specify this with SimpleDateFormat // translate.put("W","week in year with first Monday as first day..."); // There's no way to specify this with SimpleDateFormat // translate.put("w","E"); translate.put("X", "HH:mm:ss"); translate.put("x", "MM/dd/yy"); translate.put("y", "yy"); translate.put("Y", "yyyy"); translate.put("Z", "z"); translate.put("z", "Z"); translate.put("%", "%"); } /** * Create an instance of this date formatting class * * @param origFormat the strftime-style formatting string * @param locale the locale to use for locale-specific conversions */ public Strftime(String origFormat, Locale locale) { String convertedFormat = convertDateFormat(origFormat); simpleDateFormat = new SimpleDateFormat(convertedFormat, locale); } /** * Format the date according to the strftime-style string given in the constructor. * * @param date the date to format * * @return the formatted date */ public String format(Date date) { return simpleDateFormat.format(date); } /** * Get the timezone used for formatting conversions * * @return the timezone */ public TimeZone getTimeZone() { return simpleDateFormat.getTimeZone(); } /** * Change the timezone used to format dates * * @param timeZone The new time zone * * @see SimpleDateFormat#setTimeZone */ public void setTimeZone(TimeZone timeZone) { simpleDateFormat.setTimeZone(timeZone); } /** * Search the provided pattern and get the C standard Date/Time formatting rules and convert them to the Java * equivalent. * * @param pattern The pattern to search * * @return The modified pattern */ protected String convertDateFormat(String pattern) { boolean inside = false; boolean mark = false; boolean modifiedCommand = false; StringBuilder buf = new StringBuilder(); for (int i = 0; i < pattern.length(); i++) { char c = pattern.charAt(i); if (c == '%' && !mark) { mark = true; } else { if (mark) { if (modifiedCommand) { // don't do anything--we just wanted to skip a char modifiedCommand = false; mark = false; } else { inside = translateCommand(buf, pattern, i, inside); // It's a modifier code if (c == 'O' || c == 'E') { modifiedCommand = true; } else { mark = false; } } } else { if (!inside && c != ' ') { // We start a literal, which we need to quote buf.append('\''); inside = true; } buf.append(c); } } } if (!buf.isEmpty()) { char lastChar = buf.charAt(buf.length() - 1); if (lastChar != '\'' && inside) { buf.append('\''); } } return buf.toString(); } protected String quote(String str, boolean insideQuotes) { String retVal = str; if (!insideQuotes) { retVal = '\'' + retVal + '\''; } return retVal; } /** * Try to get the Java Date/Time formatting associated with the C standard provided. * * @param buf The buffer * @param pattern The date/time pattern * @param index The char index * @param oldInside Flag value * * @return True if new is inside buffer */ protected boolean translateCommand(StringBuilder buf, String pattern, int index, boolean oldInside) { char firstChar = pattern.charAt(index); boolean newInside = oldInside; // O and E are modifiers, they mean to present an alternative representation of the next char // we just handle the next char as if the O or E wasn't there if (firstChar == 'O' || firstChar == 'E') { if (index + 1 < pattern.length()) { newInside = translateCommand(buf, pattern, index + 1, oldInside); } else { buf.append(quote("%" + firstChar, oldInside)); } } else { String command = translate.getProperty(String.valueOf(firstChar)); // If we don't find a format, treat it as a literal--That's what apache does if (command == null) { buf.append(quote("%" + firstChar, oldInside)); } else { // If we were inside quotes, close the quotes if (oldInside) { buf.append('\''); } buf.append(command); newInside = false; } } return newInside; } }
Detected license expression
apache-2.0
Detected license expression (SPDX)
Apache-2.0
Percentage of license text
12.02
Copyrights

      
    
Holders

      
    
Authors

      
    
License detections License expression License expression SPDX
apache_2_0-4bde3f57-78aa-4201-96bf-531cba09e7de apache-2.0 Apache-2.0
URL Start line End line
http://www.apache.org/licenses/LICENSE-2.0 9 9