如何使用Java将当前UTC时区转换为印度标准时间

时间:2018-11-05 13:03:40

标签: java simpledateformat datetime-format

我正在尝试使用以下代码转换当前UTC时间(Linux服务器上的时间)。

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

public class UtcToIst {

    public static void main(String[] args) {
        List<String> timeZones = new ArrayList<String>();
        String ISTDateString = "";
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
        String utcTime = sdf.format(new Date());
        System.err.println("utcTime: " + utcTime);
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
        String pattern = "dd-MM-yyyy HH:mm:ss";
        SimpleDateFormat formatter;
        formatter = new SimpleDateFormat(pattern);
        try {
            String formattedDate = formatter.format(utcTime);
            Date ISTDate = sdf.parse(formattedDate);
            ISTDateString = formatter.format(ISTDate);
            timeZones.add(utcTime+ ","+ ISTDateString);
        } catch(Exception e) {
            e.printStackTrace();
        }

        for(String i: timeZones) {
            System.out.println(i);
        }
    }
}

执行代码时,出现以下异常:

utcTime: 05-11-2018 12:55:28
java.lang.IllegalArgumentException: Cannot format given Object as a Date
    at java.text.DateFormat.format(DateFormat.java:310)
    at java.text.Format.format(Format.java:157)
    at UtcToIst.main(UtcToIst.java:21)

我看到正确获取UTC时间为:05-11-2018 12:55:28 但是代码无法将字符串解析为IST(印度标准时间)。 我无法理解如何解决该问题。 谁能让我知道我在这里犯了什么错误,如何解决?

3 个答案:

答案 0 :(得分:2)

此行无用,并会导致错误(utcTime不是日期,而是字符串)。

       String formattedDate = formatter.format(utcTime);

只需替换:

        String formattedDate = formatter.format(utcTime);
        Date ISTDate = sdf.parse(formattedDate);

使用:

        Date ISTDate = sdf.parse(utcTime);

整个课程:

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

public class UtcToIst {

    public static void main(String[] args) {
        List<String> timeZones = new ArrayList<String>();
        String ISTDateString = "";
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
        String utcTime = sdf.format(new Date());
        System.err.println("utcTime: " + utcTime);
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
        String pattern = "dd-MM-yyyy HH:mm:ss";
        SimpleDateFormat formatter;
        formatter = new SimpleDateFormat(pattern);
        try {
            Date ISTDate = sdf.parse(utcTime);
            ISTDateString = formatter.format(ISTDate);
            timeZones.add(utcTime+ ","+ ISTDateString);
        } catch(Exception e) {
            e.printStackTrace();
        }

        for(String i: timeZones) {
            System.out.println(i);
        }
    }
}

答案 1 :(得分:0)

改为使用LocalDateTime

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
LocalDateTime now = LocalDateTime.now();
System.out.println(dtf.format(now));

答案 2 :(得分:0)

注意:如果服务器时区不是印度时区,@ Benoit的答案会产生错误的时间结果,应将时区显式设置为印度。

第一:在SimpleDateFormat(亚洲/加尔各答)上为印度时间设置正确的时区。

第二:使用utc格式化程序解析格式化的时间字符串以获取utc时间实例。

最后:使用印度语来格式化utc实例。

请参见以下代码:

SimpleDateFormat utcFormatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
utcFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
String utcTime = utcFormatter.format(new Date());
System.err.println("utcTime: " + utcTime);

Date utcTimeInstance = utcFormatter.parse(utcTime);
SimpleDateFormat indianFormatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
indianFormatter.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
String indianTime = indianFormatter.format(utcTimeInstance);
System.err.println("indianTime: " + indianTime);

在我的电脑上打印:

utcTime: 05-11-2018 13:42:31
indianTime: 05-11-2018 19:12:31