无法在Java中将EST转换为IST时间

时间:2016-08-22 05:54:04

标签: java swing

您好我目前正致力于使用Swing创建桌面应用程序。我能够使用Java中的Date类将IST转换为EST时间,但无法将EST转换为IST时间,并且它提供与IST时间相同的EST时间。请找到以下代码。

ChangetoEST功能从IST时间开始给出正确的EST时间。 ChangetoIST函数没有从EST时间给出正确的IST时间,并将给定的EST时间显示为IST时间。

public String changetoEST(String date) throws ParseException
{
    SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
    String dateInString = date;
    Date d=formatter.parse(dateInString);
    TimeZone tzInAmerica = TimeZone.getTimeZone("America/New_York");
    formatter.setTimeZone(tzInAmerica);
    String sDateInAmerica = formatter.format(d);
    Date dateInAmerica = formatter.parse(sDateInAmerica);
    String a=formatter.format(dateInAmerica);
    return a;
}

public String changetoIST(String date) throws ParseException
{
    SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
    String dateInString = date;
    Date d=formatter.parse(dateInString);
    TimeZone tzInIndian = TimeZone.getTimeZone("Asia/Calcutta");
    formatter.setTimeZone(tzInIndian);
    String sDateInAmerica = formatter.format(d);
    Date dateInAmerica = formatter.parse(sDateInAmerica);
    String a=formatter.format(dateInAmerica);
    return a;
}

3 个答案:

答案 0 :(得分:2)

public static String istToEst(String dateInput) throws ParseException { return changeTimeZone(dateInput, TimeZone.getTimeZone("Asia/Calcutta"), TimeZone.getTimeZone("America/New_York")); } public static String estToIst(String dateInput) throws ParseException { return changeTimeZone(dateInput, TimeZone.getTimeZone("America/New_York"), TimeZone.getTimeZone("Asia/Calcutta")); } private static String changeTimeZone(String dateInput, TimeZone sourceTimeZone, TimeZone targetTimeZone) throws ParseException { SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm a"); formatter.setTimeZone(sourceTimeZone); Date date = formatter.parse(dateInput); formatter.setTimeZone(targetTimeZone); return formatter.format(date); } 调用在没有您明确设置时区的情况下完成,这意味着使用默认时区完成解析。

在解析,解析,将时区设置为目标时区以及格式化结果之前设置源时区。

E.g。

String dateInput = "08/22/2016 02:21 AM";
System.out.println(dateInput);
System.out.println(istToEst("08/22/2016 02:21 AM"));
System.out.println(estToIst("08/22/2016 02:21 AM"));

测试

08/22/2016 02:21 AM
08/21/2016 04:51 PM
08/22/2016 11:51 AM

输出

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {


    let oldText = textField.text! as NSString
    var newText = oldText.stringByReplacingCharactersInRange(range, withString: string) as NSString!
    var newTextString = String(newText)

    let digits = NSCharacterSet.decimalDigitCharacterSet()
    var digitText = ""
    for c in newTextString.unicodeScalars {
        if digits.longCharacterIsMember(c.value) {
            digitText.append(c)
        }
    }

    let formatter = NSNumberFormatter()
    //        formatter.usesSignificantDigits = false
    formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
    formatter.locale = NSLocale(localeIdentifier: "en_US")
    let numberFromField = (NSString(string: digitText).doubleValue) / 100

    newText = formatter.stringFromNumber(numberFromField)

    if newText .isEqualToString("$0.00") {

        newText = ""

    }

    textField.text = String(newText)

    return false

}

答案 1 :(得分:1)

在解析之前将formatter设置为源时区(这是您缺少的步骤),然后在格式化之前将其设置为目标时区,否则使用本地时区对其进行解析,这对您来说就是IST。

此外,您应该能够直接返回sDateInAmerica,您无需重新解析,然后再次重新格式化。

答案 2 :(得分:1)

java.time

你正在使用麻烦的旧遗留日期时间类,现在由java.time类取代。

我们将输入字符串解析为LocalDateTime,因为它缺少有关offset-from-UTC或时区的任何信息(偏移规则,例如DST

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/yyyy hh:mm a" );
LocalDateTime ldt = LocalDateTime.parse( input , f );

应用时区以获取时间轴上的实际时刻,ZonedDateTime对象。

ZoneId zNewYork = ZoneId.of( "America/New_York" );
ZonedDateTime zdtNewYork = ldt.atZone( zNewYork );

要通过另一个时区的镜头看到同一时刻,另一个挂钟时间,请调整为另一个ZoneId。请注意,我们通过另一个LocalDateTime,因为该类的目的是忘记有关偏移或时区的任何信息。我们希望相反,使用有关时区的信息,以便在区域之间明智地进行调整。因此,虽然纽约落后于 UTC四个小时,但印度提前的时间为5.5小时。所以我们需要总共九个半小时的调整,其中可能包括更改日期。

ZoneId zKolkata = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdtKolkata = zdtNewYork.withZoneSameInstant( zKolkata );  // Same simultaneous moments on the timeline.

生成字符串

您可以生成任何希望表示日期时间值的格式的字符串。

String output = zdtKolkata.format( f );

通常最好让java.time自动为您定位。

Locale l = Locale.CANADA_FRENCH;  // Or Locale.US, Locale.ITALY, etc.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( l );
String output = zdtKolkata.format( f );