Java 将时区转换回本地

Java 将时区转换回本地,java,groovy,Java,Groovy,我无法将日期对象转换回本地时区。我在谷歌上搜索了很多,但都找不到解决方案 我的场景是:我将一个请求(带有本地时区04/01/2014T000:00:00+0530的完整日期字符串)发送到一个web服务器,该服务器位于我所在时区以外的其他时区。服务器将其适当地转换为UTC,并执行一些操作,然后将CSV文件发送回。我在CSV中有一个日期列,它总是以GMT为单位 String input = "04/01/2014T00:00:00+0530"; DateFormat inputDateFormat

我无法将日期对象转换回本地时区。我在谷歌上搜索了很多,但都找不到解决方案

我的场景是:我将一个请求(带有本地时区04/01/2014T000:00:00+0530的完整日期字符串)发送到一个web服务器,该服务器位于我所在时区以外的其他时区。服务器将其适当地转换为UTC,并执行一些操作,然后将CSV文件发送回。我在CSV中有一个日期列,它总是以GMT为单位

String input = "04/01/2014T00:00:00+0530";
DateFormat inputDateFormat = new SimpleDateFormat("MM/dd/yyyy'T'HH:mm:ssZ");
DateFormat csvFileDateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm z");

Date inputDate = inputDateFormat.parse(input); // Mon Mar 31 18:30:00 GMT 2014
// inputDateFormat.getTimeZone(); // is always GMT

// After some processing I create CSV file
// within a loop
Date csvDate = // got Date from some operation, for simplicity I removed the code.
csvFileDateFormat.format(csvDate); // **HERE IS THE ISSUE**
// end of loop
我想正确设置csvFileDateFormat的时区。下面的代码可以工作,但我不想硬编码“GMT+05:30”。相反,我们只需要从输入字符串中提取时区

csvFileDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+05:30")); // I dont want to hard code
非常感谢您的帮助。 PS:我没有选择使用任何其他库,比如joda等等

问候
ArunDhaJ

您可以使用
Locale.getDefault()
返回运行它的系统的默认时区。如果您不想返回,那么硬编码应该是安全的。

也许此函数将帮助您:

private static TimeZone getTimeZoneFromString(String inputDateStr)
{
    // TimeZone inputTimeZone = null;
    // null or default
    TimeZone inputTimeZone = TimeZone.getDefault();
    try
    {
        DateFormat inputDateFormat = new SimpleDateFormat("MM/dd/yyyy'T'HH:mm:ssZ");
        Date inputDate = inputDateFormat.parse(inputDateStr);
        Date inputDate2 = inputDateFormat.parse(inputDateStr.substring(0, 19) + "+0000");
        int offset = (int) (inputDate2.getTime() - inputDate.getTime());
        for (String tzId : TimeZone.getAvailableIDs())
        {
            TimeZone tz = TimeZone.getTimeZone(tzId);
            if (tz.getOffset(inputDate.getTime()) == offset)
            { // take the first matching one, display name doesn't matter
                inputTimeZone = tz;
                break;
            }
        }
    }
    catch (ParseException e)
    {
        e.printStackTrace();
    }
    return inputTimeZone;
}

谢谢你。在某种程度上,我只是通过解析输入字符串(在Groovy中)来实现的。。。字符串时区=输入[-5..-1];inputDateFormat.setTimeZone(TimeZone.getTimeZone(“GMT”+TimeZone));但我想知道是否有直接的方法可以做到这一点。