时间戳转换器

时间:2016-07-16 15:52:05

标签: java timestamp

我尝试在java中为日期和日期创建时间戳到时间戳转换器。转换器逻辑工作正常,我在控制台窗口上显示它。但这种方法效果不正确。

如果我在控制台窗口中输入此时间戳:

1449946800000 (I get this timestamp from my calendar web plugin)  

Date : 13.10.2016 20:00:00 (Timezone "Europe/Berlin ) = 1476381600000

我第一次打电话给需要时间戳格式的mehtod。

      LongStamp = LongStamp/1000;   

        logic.convertedTime(LongStamp);

        } else {
          .....

        }

如果匹配,则方法logic.convertedTime(xx)正在调用。 (参见class convertLogic)

这是我的代码:

public class convertLogic {

/** TimeZone-Support**/ 
private static final String TIMEZONEBERLIN = "Europe/Berlin";


/**
 * convertedTime:  <br>
 * input timestamp to convert into date <br>
 * <strong>...</strong>
 * @param timestamp 
 */
public void convertedTime(long timestamp) {

    TimeZone timeZoneBerlin = TimeZone.getTimeZone(TIMEZONEBERLIN);
    // System.out.println(timeZoneBerlin.getDisplayName());
    // System.out.println(timeZoneBerlin.getID());
    // System.out.println(timeZoneBerlin.getOffset(System.currentTimeMillis()));

    Calendar myDate = GregorianCalendar.getInstance();
    myDate.setTimeZone(timeZoneBerlin);
    myDate.setTimeInMillis(timestamp * 1000);

    int month = myDate.get(Calendar.MONTH) + 1;
    int second = Integer.parseInt(leadingZero(myDate.get(Calendar.SECOND)));


    System.out.println("Datum: " + myDate.get(Calendar.DAY_OF_MONTH) + "." + month + "." + myDate.get(Calendar.YEAR)
            + " " + myDate.get(Calendar.HOUR_OF_DAY) + ":" + myDate.get(Calendar.MINUTE) + ":"
            + second);

}



 /**
 * leadingZero for 2 digit values
 * 
 * @param value
 * @return String
 */
private static String leadingZero(int value) {

    int testValue = value;

    if (testValue < 10) {

        return "0" + value;
    } else {

        return value + "";
    }

}

我得到以下输出:

 Datum: 13.10.2016 20:0:0

但我想要或者我需要像小时,分钟和秒这样的所有零:

  13.10.2016 20:00:00 

有人知道解决方案吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

修复:调用leadingZero方法

添加前导零后,您可以有效地删除它。

在使用前导零填充后,您调用Integer.parseInt。该调用会生成一个数字int。将其转换为String时使用的默认格式没有前导零。

second的数据类型更改为String

同样,将myDate.get(Calendar.HOUR_OF_DAY)的结果传递给您的leadingZero方法。

奇怪的结果

我不明白你的输入和结果。如果1449946800000是从UTC 1970年第一时刻开始的毫秒数,那就是2015年的日期时间而不是2016年:

  • 2015-12-12T19:00:00Z
  • 2015-12-12T20:00+01:00[Europe/Berlin]

java.time

你工作太辛苦了。使用日期时间框架来完成这项工作。

java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date.Calendar和&amp; java.text.SimpleDateFormat

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。

示例代码

首先将您的count-from-epoch转换为Instant对象,代表UTC中时间轴上的某个时刻,其分辨率最高为nanoseconds

long input = 1_449_946_800_000L;
Instant instant = Instant.ofEpochMilli ( input );

应用时区Europe/BerlinZoneId代表时区。我们使用它来生成ZonedDateTime对象。

ZoneId zoneId = ZoneId.of ( "Europe/Berlin" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );

创建一个String来表示ZonedDateTime对象的值。

无需定义格式模式。 DateTimeFormatter类可以自动将日期时间表示本地化为人类语言和Locale定义的文化规范。您所需的格式已知为德国常用的中等长度格式。

了解time zoneLocale是截然不同的。一个人将日期时间的含义调整为地球上某个地理区域的挂钟时间。另一个翻译日或月的名称,并确定逗号与句号以及其他此类问题。

Locale locale = Locale.GERMANY;
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.MEDIUM ).withLocale ( locale );
String output = zdt.format ( formatter );

转储到控制台。

System.out.println ( "input: " + input + " | instant: " + instant + " | zdt: " + zdt + " | output: " + output );
  

输入:1449946800000 |时刻:2015-12-12T19:00:00Z | zdt:2015-12-12T20:00 + 01:00 [欧洲/柏林] |输出:12.12.2015 20:00:00

答案 1 :(得分:0)

DateFormat可能是您的简化代码的朋友(或者在Java 8的情况下为DateTimeFormatter)。