151 lines
5.1 KiB
Java
151 lines
5.1 KiB
Java
/* ====================================================================
|
|
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.poi.util;
|
|
|
|
import java.nio.charset.Charset;
|
|
import java.util.Calendar;
|
|
import java.util.Locale;
|
|
import java.util.TimeZone;
|
|
|
|
/**
|
|
* This utility class is used to set locale and time zone settings beside
|
|
* of the JDK internal {@link java.util.Locale#setDefault(Locale)} and
|
|
* {@link java.util.TimeZone#setDefault(TimeZone)} methods, because
|
|
* the locale/time zone specific handling of certain office documents -
|
|
* maybe for different time zones / locales ... - shouldn't affect
|
|
* other java components.
|
|
*
|
|
* The settings are saved in a {@link java.lang.ThreadLocal},
|
|
* so they only apply to the current thread and can't be set globally.
|
|
*/
|
|
public final class LocaleUtil {
|
|
private LocaleUtil() {
|
|
// no instances of this class
|
|
}
|
|
|
|
/**
|
|
* Excel doesn't store TimeZone information in the file, so if in doubt,
|
|
* use UTC to perform calculations
|
|
*/
|
|
public static final TimeZone TIMEZONE_UTC = TimeZone.getTimeZone("UTC");
|
|
|
|
/**
|
|
* Default encoding for unknown byte encodings of native files
|
|
* (at least it's better than to rely on a platform dependent encoding
|
|
* for legacy stuff ...)
|
|
*/
|
|
public static final Charset CHARSET_1252 = Charset.forName("CP1252");
|
|
|
|
private static final ThreadLocal<TimeZone> userTimeZone = new ThreadLocal<TimeZone>();
|
|
private static final ThreadLocal<Locale> userLocale = new ThreadLocal<Locale>();
|
|
|
|
/**
|
|
* As time zone information is not stored in any format, it can be
|
|
* set before any date calculations take place.
|
|
* This setting is specific to the current thread.
|
|
*
|
|
* @param timezone the timezone under which date calculations take place
|
|
*/
|
|
public static void setUserTimeZone(TimeZone timezone) {
|
|
userTimeZone.set(timezone);
|
|
}
|
|
|
|
/**
|
|
* @return the time zone which is used for date calculations. If not set, returns {@link TimeZone#getDefault()}.
|
|
*/
|
|
@SuppressForbidden("implementation around default locales in POI")
|
|
public static TimeZone getUserTimeZone() {
|
|
TimeZone timeZone = userTimeZone.get();
|
|
return (timeZone != null) ? timeZone : TimeZone.getDefault();
|
|
}
|
|
|
|
/**
|
|
* Clear the thread-local user time zone.
|
|
*/
|
|
public static void resetUserTimeZone() {
|
|
userTimeZone.remove();
|
|
}
|
|
|
|
/**
|
|
* Sets default user locale.
|
|
* This setting is specific to the current thread.
|
|
*/
|
|
public static void setUserLocale(Locale locale) {
|
|
userLocale.set(locale);
|
|
}
|
|
|
|
/**
|
|
* @return the default user locale. If not set, returns {@link Locale#getDefault()}.
|
|
*/
|
|
@SuppressForbidden("implementation around default locales in POI")
|
|
public static Locale getUserLocale() {
|
|
Locale locale = userLocale.get();
|
|
return (locale != null) ? locale : Locale.getDefault();
|
|
}
|
|
|
|
public static void resetUserLocale() {
|
|
userLocale.remove();
|
|
}
|
|
|
|
/**
|
|
* @return a calendar for the user locale and time zone
|
|
*/
|
|
public static Calendar getLocaleCalendar() {
|
|
return getLocaleCalendar(getUserTimeZone());
|
|
}
|
|
|
|
/**
|
|
* Convenience method - month is 0-based as in java.util.Calendar
|
|
*
|
|
* @param year
|
|
* @param month
|
|
* @param day
|
|
* @return a calendar for the user locale and time zone, and the given date
|
|
*/
|
|
public static Calendar getLocaleCalendar(int year, int month, int day) {
|
|
return getLocaleCalendar(year, month, day, 0, 0, 0);
|
|
}
|
|
|
|
/**
|
|
* Convenience method - month is 0-based as in java.util.Calendar
|
|
*
|
|
* @param year
|
|
* @param month
|
|
* @param day
|
|
* @param hour
|
|
* @param minute
|
|
* @param second
|
|
* @return a calendar for the user locale and time zone, and the given date
|
|
*/
|
|
public static Calendar getLocaleCalendar(int year, int month, int day, int hour, int minute, int second) {
|
|
Calendar cal = getLocaleCalendar();
|
|
cal.set(year, month, day, hour, minute, second);
|
|
cal.clear(Calendar.MILLISECOND);
|
|
return cal;
|
|
}
|
|
|
|
/**
|
|
* @return a calendar for the user locale and time zone
|
|
*/
|
|
public static Calendar getLocaleCalendar(TimeZone timeZone) {
|
|
return Calendar.getInstance(timeZone, getUserLocale());
|
|
}
|
|
}
|
|
|