如何用java从C#编写DateTime.UtcNow.Ticks
我正试图将下面两行代码从C#改写成Java如何用java从C#编写DateTime.UtcNow.Ticks,java,c#,java-time,instant,Java,C#,Java Time,Instant,我正试图将下面两行代码从C#改写成Java long ticks1970Onwards = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).Ticks; long newTs = (DateTime.UtcNow.Ticks - ticks1970Onwards)/10000; 我尝试了多种方法,但没有得到正确的解决方案 ZonedDateTime dt1 = LocalDateTime.now().atZo
long ticks1970Onwards = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).Ticks;
long newTs = (DateTime.UtcNow.Ticks - ticks1970Onwards)/10000;
我尝试了多种方法,但没有得到正确的解决方案
ZonedDateTime dt1 = LocalDateTime.now().atZone(ZoneId.of("UTC"));
ZonedDateTime dt2 = LocalDateTime.of(1901, 1, 1, 0, 0).atZone(ZoneId.of("UTC"));
Duration duration2 = Duration.between(dt2, dt1);
System.out.printf("Duration = %s milliseconds.%n", duration2.getSeconds()*1000);
private static final long TICKS_AT_EPOCH = 621355968000000000L;
private static final long TICKS_PER_MILLISECOND = 10000;
public static void main(String[] args) {
long ticks = 634200192000000000L;
Date date = new Date((ticks - TICKS_AT_EPOCH)/TICKS_PER_MILLISECOND);
System.out.println(date);
TimeZone utc = TimeZone.getTimeZone("UTC");
Calendar calendar = Calendar.getInstance(utc);
calendar.setTime(date);
System.out.println(calendar);
}
}
private static final long TICKS_AT_EPOCH = 621355968000000000L;
private static final long TICKS_PER_MILLISECOND = 10000;
public static long getUTCTicks(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return (calendar.getTimeInMillis() * TICKS_PER_MILLISECOND) + TICKS_AT_EPOCH;
}
public static Date getDate(long UTCTicks){
return new Date((UTCTicks - TICKS_AT_EPOCH)/TICKS_PER_MILLISECOND);
}
1970-01-01T00:00:00Z
的历元开始的毫秒数,其中Z
表示Zulu
时间,表示UTC
import java.time.Instant;
public class Main {
public static void main(String[] args) {
Instant now = Instant.now();
System.out.println(now.toEpochMilli());
}
}
您可以将此结果与位于的C#代码的结果进行比较
注意:避免使用三个字母的缩写来指定时区。时区应使用以下格式的名称来指定:地区/城市,例如(“欧洲/伦敦”)的ZoneId.
。根据此约定,UTC的ZoneId
可以使用ZoneId.of(“Etc/UTC”)来指定
。根据UTC[+/-]偏移量指定的时区可以指定为Etc/GMT[+/-]偏移量
,例如ZoneId.of(“Etc/GMT+1”)
,ZoneId.of(“Etc/GMT+1”)
Etc
还有一些例外情况,例如,要指定土耳其
的时区,您可以指定
ZoneId.of("Turkey")
但是,建议()使用与上述相同的模式,即表示土耳其时区的建议方式为:
ZoneId.of("Asia/Istanbul")
或
很可能,Istanbul
被两个地区/大陆引用是它仍然由ZoneId.getAvailableZoneIds()返回的原因
以下代码将为您提供所有可用的ZoneId
s:
// Get the set of all time zone IDs.
Set<String> allZones = ZoneId.getAvailableZoneIds();
//获取所有时区ID的集合。
设置allZones=ZoneId.getAvailableZoneIds();
您可以用System.currentTimeMillis()替换整个c
-这将给出自1970-1年以来的毫秒数-1@IłyaBursov是的,如果你有反对面向对象的东西,你可以。使用Instant
或java.time中的其他类的代码更容易解释。java.util
的日期时间API及其格式化API,SimpleDateFormat
已经过时且容易出错。建议您完全停止使用它们,并切换到。感谢您的参与。但这是过时的答案。我建议您不要使用日期
、时区
和日历
。这些类设计糟糕且过时很长。请改用.J中的类ust如问题所述。不推荐使用时区IDTurkey
。推荐土耳其使用的时区ID为Asia/Istanbul
和Europe/Istanbul
(因为伊斯坦布尔是土耳其最大的城市,与欧洲的老城区和亚洲的大城区一起分布)。谢谢,@OleV.V.提供了有关土耳其
的重要信息。可能是伊斯坦布尔
与两个地区/大陆相关,这就是为什么它仍然由ZoneId.getAvailableZoneIds()返回的原因。
ZoneId.getAvailableZoneIds()
通常会返回大量不推荐的ID,但没有任何标记表明它们已不推荐。仅提及少数:非洲/阿斯梅拉、美国/布宜诺斯艾利斯、美国/戈达布、美国/诺克斯丁、亚洲/加尔各答、澳大利亚/LHI、巴西/阿克雷、加拿大/大西洋、CET、CST6CDT、古巴等/格林威治、GB、大都会、新西兰聊天室。我正在使用(本身不是最新的)用于检查哪些已弃用。
ZoneId.of("Europe/Istanbul")
// Get the set of all time zone IDs.
Set<String> allZones = ZoneId.getAvailableZoneIds();