【问题标题】:How to convert current UTC Timezone to Indian Standard Time using Java [duplicate]如何使用 Java 将当前 UTC 时区转换为印度标准时间 [重复]
【发布时间】:2018-11-05 13:03:40
【问题描述】:

我正在尝试使用以下代码转换当前的 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(印度标准时间)。 我无法理解如何解决这个问题。 谁能让我知道我在这里犯了什么错误,我该如何解决?

【问题讨论】:

  • utcTime 不是Date,而是String,因此出现错误...
  • 我建议你避免使用SimpleDateFormat 类。它不仅过时了,而且出了名的麻烦。今天我们在java.time, the modern Java date and time API 中做得更好。
  • 你怎么好像错过了这个问题已经被问过一百次了?
  • 提示:将您的异常消息粘贴到您的搜索引擎中。它通常会导致一个好的解决方案。
  • 您应该真正遵循 Java 命名约定:变量名总是以小写字母开头。

标签: java simpledateformat datetime-format


【解决方案1】:

此行无用并导致错误(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);
        }
    }
}

【讨论】:

    【解决方案2】:

    改用 LocalDateTime

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

    【讨论】:

    • 使用 java.time 是个好主意,但单独使用 LocalDateTime 将无法完成从 UTC 到 IST 要求的转换。
    • 它有一个方法 atZone(ZoneId zone) 可以转换为任何时区
    【解决方案3】:

    注意:如果服务器时区不是印度时区,@Benoit 的回答会产生不正确的时间结果,应明确将时区设置为印度。

    首先:在SimpleDateFormat,亚洲/加尔各答设置正确的时区为印度时间。

    第二:使用utc formatter解析格式化的时间字符串,得到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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-11
      • 2018-07-03
      • 2023-03-10
      • 1970-01-01
      • 2015-03-17
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多