英文:
how can i get Calendar.getInstance() based on Turkey timezone
问题
我正在开发一个Android应用程序。
要根据土耳其当地时间获取当前时间,我应该怎么做?
val now = Calendar.getInstance(TimeZone.getTimeZone("GMT+3"))
结果为:
2020-08-25T18:16:30
但是该网站的结果不同:
https://www.timeanddate.com/worldclock/turkey/istanbul
2020-08-25T16:46:30
输出是使用以下代码段打印的:
DebugHelper.info("one now => ${now.getDisplayMonthNameDayTime(FULL_PATTERN)}")
扩展函数:
const val FULL_PATTERN = "yyyy-MM-dd'T'HH:mm:ss"
fun Calendar.getDisplayMonthNameDayTime(pattern: String = "dd MMM , HH:mm ") = SimpleDateFormat(
pattern,
Locale.getDefault()
).format(time).toUpperCase(Locale.getDefault())
英文:
I am developing an android application.
What should I do to get the current time based on Turkish local time?
val now = Calendar.getInstance(TimeZone.getTimeZone("GMT+3"))
the result is:
2020-08-25T18:16:30
but this website result is different:
https://www.timeanddate.com/worldclock/turkey/istanbul
2020-08-25T16:46:30
The output is printed using the following code snippet:
DebugHelper.info("one now => ${now.getDisplayMonthNameDayTime(FULL_PATTERN)}")
Extention Function:
const val FULL_PATTERN = "yyyy-MM-dd'T'HH:mm:ss"
fun Calendar.getDisplayMonthNameDayTime(pattern: String = "dd MMM , HH:mm ") = SimpleDateFormat(
pattern,
Locale.getDefault()
).format(time).toUpperCase(Locale.getDefault())
答案1
得分: 3
如果您想使用现代且不太麻烦的 API,可以使用 java.time
,尤其是 java.time.ZonedDateTime
。
看一下这个简单的例子:
public static void main(String[] args) {
ZonedDateTime istanbulDateTime = ZonedDateTime.now(ZoneId.of("Europe/Istanbul"));
System.out.println(istanbulDateTime);
}
输出(几秒钟前):
2020-08-25T16:32:56.069+03:00[Europe/Istanbul]
作为替代,还有 ZoneId.of("Asia/Istanbul")
,但这些值在大陆的描述上有所不同。这只是个人口味的问题,我想。
编辑
在您的编辑之后,我意识到您并不依赖于时区,而是依赖于偏移量。这带来了 java.time
的另一个选择,即 java.time.OffsetDateTime
。
为了完整起见,这里有一个可能的解决方案,它只使用 ZoneOffset
而不需要通过 String
提供时区:
public static void main(String[] args) {
OffsetDateTime utcPlusThreeDateTime = OffsetDateTime.now(ZoneOffset.ofHours(3));
System.out.println(utcPlusThreeDateTime);
}
输出(几秒钟前):
2020-08-25T16:53:14.490+03:00
... 是的,由于在 Android 中存在 API 次级支持,您可以使用适当的 Gradle 插件来使用它。
英文:
If you want to use a modern and less troublesome API, then use java.time
, especially java.time.ZonedDateTime
.
See this minimal example:
public static void main(String[] args) {
ZonedDateTime istanbulDateTime = ZonedDateTime.now(ZoneId.of("Europe/Istanbul"));
System.out.println(istanbulDateTime);
}
Output (some seconds ago):
2020-08-25T16:32:56.069+03:00[Europe/Istanbul]
As an alternative, there is ZoneId.of("Asia/Istanbul")
, too, but the values only differ in the description of the continent. Just a matter of taste, I think.
EDIT
After your edit I realized you aren't relying on a time zone but rather an offset. That brings in another alternative from java.time
, that is java.time.OffsetDateTime
.
For the sake of completeness, here's a possible solution which only takes a ZoneOffset
without the need to provide a zone by String
:
public static void main(String[] args) {
OffsetDateTime utcPlusThreeDateTime = OffsetDateTime.now(ZoneOffset.ofHours(3));
System.out.println(utcPlusThreeDateTime);
}
which output (a few seconds ago)
2020-08-25T16:53:14.490+03:00
... and yes, since there's API desugaring in Android, you can use it with a suitable gradle plugin.
答案2
得分: 1
解决方案
使用 ZoneId.of("Asia/Istanbul")
和来自java.time的ZonedDateTime
,这是现代Java日期和时间API的一部分,如deHaar的答案中所示。
问题
您的问题在于这行代码:
).format(time).toUpperCase(Locale.getDefault())
time
将 Calendar
对象的时间作为 Date
(另一个设计不佳且过时的类,我们不应再使用它)提供。Date
没有任何时区信息,因此来自 Calendar
的时区和偏移信息将丢失。因此,当您格式化此 Date
时,您实际上使用的是 SimpleDateFormat
的时区,而不是 Calendar
的时区。
您的 Calendar
的时区是 GMT+03:00
。正如其他人提到的,您应该更倾向于使用Europe/Istanbul或Asia/Istanbul。
链接
- Oracle教程:日期时间,解释了如何使用java.time。
- 相关问题:Java中的时区问题(甚至可能是重复的问题?)
英文:
The solution
Use ZoneId.of("Asia/Istanbul")
and a ZonedDateTime
from java.time, the modern Java date and time API, as demonstrated in the answer by deHaar.
The problem
You problem is in this line:
).format(time).toUpperCase(Locale.getDefault())
time
gives you the time of the Calendar
object as a Date
(another poorly designed and long outdated class that we should not use anymore). A Date
hasn’t got any time zone, so the time zone and offset information from the Calendar
is lost. So when you format this Date
, you are using the time zone of the SimpleDateFormat
, not the time zone of the Calendar
.
Your Calendar
’s time zone was GMT+03:00
alright. As others have mentioned, you should prefer Europe/Istanbul or Asia/Istanbul, though.
Links
- Oracle tutorial: Date Time explaining how to use java.time.
- Related question: TimeZone problem in Java (it might even be a duplicate?)
答案3
得分: 0
土耳其在使用Java中的实时操作方面存在问题...
你需要使用GMT+03进行自己的修改
TimeZone.getTimeZone("GMT+03")
代码:
TimeZone timeZone = TimeZone.getTimeZone("GMT+03");
Calendar calendar = Calendar.getInstance(timeZone);
英文:
Turkey have an issue with real time in java...
you need to do you own hack with GMT+03
TimeZone.getTimeZone("GMT+03")
code:
TimeZone timeZone = TimeZone.getTimeZone("GMT+03");
Calendar calendar = Calendar.getInstance(timeZone);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论