【问题标题】:Get Time stamp using Java GMT+5:30使用 Java GMT+5:30 获取时间戳
【发布时间】:2015-07-21 14:01:02
【问题描述】:

我想要给定日期的时间戳。 使用此代码

 public static String getTimestamp(String time)
        {
            DateFormat dfm = new SimpleDateFormat("dd-mm-yy hh:mm:ss");  

            long unixtime = 0;
            dfm.setTimeZone(TimeZone.getTimeZone("GMT+5:30"));
        try
        {
            unixtime = dfm.parse(time).getTime();  
            unixtime=unixtime/1000;
        } 
        catch (ParseException e) 
        {
            e.printStackTrace();
        }
        return ""+unixtime;
        }

        public static void main(String[] args)
        {
            System.out.println(getTimestamp("11-05-15 11:54:55"));
        }

但是当我输入这个日期11-05-15 11:54:55 然后程序返回我 1420957495 这个时间戳是一月(01)的时间戳,但我想要五月(06) 请帮帮我

【问题讨论】:

  • 尝试注释掉unixtime=unixtime/1000;这一行
  • 在 GMT+5:30 印度时区注释行后输出相同

标签: java date datetime time timestamp


【解决方案1】:

您的偏移量无效

有效的偏移量必须包含填充零。您的偏移字符串GMT+5:30 应该是GMT+05:3005 之前。

除此之外,Meno Hochschildthe Answer 是正确和明智的。

java.time

java.util.Date/.Calendar 和 SimpleDateFormat 类是出了名的麻烦、混乱和缺陷。 避开它们。

改为使用 Java 8 及更高版本中的 java.time 包。如果缺少,请使用Joda-Time 库。

这是一些 java.time 代码(Java 8)。

首先,将您的输入解析为“本地”日期时间值,这意味着没有附加任何时区。由于输入中没有包含偏移量或时区,因此该值可以应用于任何特定的地区。

String input = "11-05-15 11:54:55";  // Strongly recommend using 4-digit year whenever possible, as suggested in Meno Hochschild’s Answer.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd-MM-yy HH:mm:ss" ); // No need for Locale in this case, but always consider it.
LocalDateTime localDateTime = LocalDateTime.parse( input , formatter );

接下来,我们假设这个值是为了代表印度的一个时刻。让我们分配一个时区。我们可以只分配一个偏移量。但通常我们应该使用时区。时区是加上过去、现在和未来的一组调整和异常规则的偏移量,例如夏令时。

首先我们为印度实例化一个时区。然后我们在添加时区的同时根据LocalDateTime生成ZonedDateTime

// Assign a time zone.
//ZoneId zoneId_plus_5_30 = ZoneId.of( "GMT+05:30" );  // You can use an offset, but know that a time zone is *more* than an offset.
ZoneId zoneIdKolkata = ZoneId.of( "Asia/Kolkata" );  // Better to use a time zone name if one is applicable. Ex: "Asia/Kolkata".
ZonedDateTime zonedDateTimeKolkata = ZonedDateTime.of( localDateTime , zoneIdKolkata );

为了好玩,让我们将同一时刻调整为 UTC 和蒙特利尔。

ZonedDateTime zonedDateTimeUtc = zonedDateTimeKolkata.withZoneSameInstant( ZoneOffset.UTC );
ZonedDateTime zonedDateTimeMontréal = zonedDateTimeKolkata.withZoneSameInstant( ZoneId.of( "America/Montreal" ) );

转储到控制台。

System.out.println( "Input: " + input );
System.out.println( "localDateTime: " + localDateTime );
System.out.println( "zonedDateTimeKolkata: " + zonedDateTimeKolkata );
System.out.println( "zonedDateTimeUtc: " + zonedDateTimeUtc );
System.out.println( "zonedDateTimeMontréal: " + zonedDateTimeMontréal );

运行时。

Input: 11-05-15 11:54:55
localDateTime: 2015-05-11T11:54:55
zonedDateTimeKolkata: 2015-05-11T11:54:55+05:30[Asia/Kolkata]
zonedDateTimeUtc: 2015-05-11T06:24:55Z
zonedDateTimeMontréal: 2015-05-11T02:24:55-04:00[America/Montreal]

【讨论】:

    【解决方案2】:

    你应该改变你的模式。到目前为止,就月份而言,公认的答案是正确的。仍然缺少的是一天中小时的模式符号。它应该是 H 而不是 h。或者,如果您更喜欢英文小时符号,您可以使用附加的字母“a”来表示 AM/PM。所以最终的解决方案是:

    DateFormat dfm = new SimpleDateFormat("dd-MM-yy HH:mm:ss");
    

    DateFormat dfm = new SimpleDateFormat("dd-MM-yy hh:mm:ss a", Locale.ENGLISH);
    

    顺便说一句,我建议使用 4 位数的年份来排除任何使用 yyyy 的矛盾心理。

    【讨论】:

      【解决方案3】:

      使用这个 DateFormat dfm = new SimpleDateFormat("dd-MM-yy hh:mm:ss");

      大写MM代表月份,小写代表分钟

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-12
        • 1970-01-01
        • 1970-01-01
        • 2016-06-15
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        • 2011-08-26
        相关资源
        最近更新 更多