我尝试在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
有人知道解决方案吗?
提前致谢!
答案 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 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/Berlin
。 ZoneId
代表时区。我们使用它来生成ZonedDateTime
对象。
ZoneId zoneId = ZoneId.of ( "Europe/Berlin" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
创建一个String来表示ZonedDateTime
对象的值。
无需定义格式模式。 DateTimeFormatter
类可以自动将日期时间表示本地化为人类语言和Locale
定义的文化规范。您所需的格式已知为德国常用的中等长度格式。
了解time zone和Locale
是截然不同的。一个人将日期时间的含义调整为地球上某个地理区域的挂钟时间。另一个翻译日或月的名称,并确定逗号与句号以及其他此类问题。
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
)。