How to show Dutch month using Joda DateTime - android

I'm trying to show dutch months. But the month is printed out in English. This needs to work from Android API 19 and higher.
compile 'joda-time:joda-time:2.9.9'
val test = DateTime()
val l = Locale("nl_NL") // Dutch language, Netherlands country.
val f = DateTimeFormat.forPattern("dd MMM yyyy").withLocale(l)
val text = f.print(test)
Prints out:
26 Oct 2017
Should be:
26 Okt 2017

You must use the Locale's 2-arg constructor, that receives the language and country code in separate parameters:
val l = Locale("nl", "NL")
With this, the output is:
26 okt 2017
In my tests, the output is not in uppercase Okt as you wanted, but that's built-in in the API and we have no control over it. If you want Okt as output, you'll have to manipulate the string by yourself.

Correct answer:
val l = Locale("nl", "NL")
val f = DateTimeFormat.forPattern("dd MMM yyyy").withLocale(l)
val dateStr = f.print(dateTime).substring(3, 4).toUpperCase()
val capitalizedDate = StringBuilder(f.print(dateTime))
capitalizedDate.setCharAt(3, dateStr[0])
return capitalizedDate.toString().replace(".", "")

I already answered to a similar question here. You can get a localized month name using Calendar object.
private String getMonthName(final int index, final Locale locale, final boolean shortName)
{
String format = "%tB";
if (shortName)
format = "%tb";
Calendar calendar = Calendar.getInstance(locale);
calendar.set(Calendar.MONTH, index);
calendar.set(Calendar.DAY_OF_MONTH, 1);
return String.format(locale, format, calendar);
}
Example for full month name:
System.out.println(getMonthName(0, new Locale("NL"), false));
Result: januari
Example for short month name:
System.out.println(getMonthName(2, new Locale("NL"), true));
Result: jan.

Related

how to get date without depending on systems date [duplicate]

This question already has answers here:
How to get current time from internet in android
(8 answers)
Closed 3 days ago.
i want to get the date and time without using the systems date
i am using android studio emulator changing emulators date.
ex: todays date is 2 Feb 2023 but i change my devices date to 26 Feb 2023. i still want it to display 2 Feb 2023 of todays date without depending on systems/device date
this is my code
var dateTime: String
val timeZone = TimeZone.getTimeZone("GMT+8")
val calendar = Calendar.getInstance(timeZone)
val simpleDateFormat = SimpleDateFormat("d MMM yyyy", Locale.US)
simpleDateFormat.setTimeZone(timeZone)
dateTime = simpleDateFormat.format(calendar.getTime()).toString()
but it still returns depending on the systems date
Yes, it is possible but you need to make a network call for it
https://worldtimeapi.org/api/timezone/Asia/Kolkata
it will give you JSON like this
{
"abbreviation": "IST",
"client_ip": "122.170.105.143",
"datetime": "2023-02-15T10:23:26.414176+05:30",
"day_of_week": 3,
"day_of_year": 46,
"dst": false,
"dst_from": null,
"dst_offset": 0,
"dst_until": null,
"raw_offset": 19800,
"timezone": "Asia/Kolkata",
"unixtime": 1676436806,
"utc_datetime": "2023-02-15T04:53:26.414176+00:00",
"utc_offset": "+05:30",
"week_number": 7
}
Once you have JSON in the response variable you can parse it like
var response; //it will contains response
var datetime = response.getString("datetime");
//if you want to parse it in readable format do it like this
val informat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS")
val outFormat = SimpleDateFormat("dd/MM/yyyy hh:mm:s a")
outputString = outFormat.format(informat.parse(datetime))
you may need to execute the network call in IO Thread you can use this
import in your gradle
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
//your code
CoroutineScope(Dispatchers.IO).launch {
var response =
JSONObject(URL("https://worldtimeapi.org/api/timezone/Asia/Kolkata").readText())
val datetime = response.getString("datetime")
val informat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS")
val outFormat = SimpleDateFormat("dd/MM/yyyy hh:mm:s a")
var outputString = outFormat.format(informat.parse(datetime))
binding.text.text = outputString
}

How to format string to date in Android

In my application I one string such as 2023-2-14 and I want convert this to 2023-02-14.
I write below codes:
val format = SimpleDateFormat("yyyy-MM-dd")
val date: Date = format.parse(startDateStr)
Log.e("dateLog",""+date)
But in logcat show me this : Wed Feb 15 00:00:00 GMT+03:30 2023
Why? I used this format : yyyy-MM-dd.
Why not used this format?
you are just parsing date, without a time, thus date object have set 00 for hour, day etc. now use format method for converting old String to new one
val formatAs = "yyyy-MM-dd"
var format = SimpleDateFormat(formatAs)
val date: Date = format.parse(startDateStr)
Log.e("dateLog","date:"+date)
String dateAsStringFormatted = format.format(date);
Log.e("dateLog","dateAsStringFormatted:"+dateAsStringFormatted)
some other answers in HERE

Displaying time from timestamp in Unix, UTC in Android Kotlin

I am working on a simple weather app and am trying to display time in the format "K:mm a" (eg. 6:30 AM). I am fetching a timestamp in Unix, UTC for the specified place a user searches for such as NYC. The timestamp looks something like 1624836905 and the time zone offset such as -14400. I have a function which adds the two up, converts it to milliseconds and should return the time in the format specified. The function is as follows:
fun dateTime(time: Int, zone: Int, format: String = "EEE, MMMM d K:mm a"): String {
return try {
val sdf = SimpleDateFormat(format)
val netDate = Date((time.plus(zone)).toLong() * 1000)
sdf.timeZone = TimeZone.getTimeZone("UTC")
sdf.format(netDate)
} catch (e: Exception) {
e.toString()
}
}
And I call it such as:
sunriseTextView.text = dateTime(result2.lookup<Int>("daily.sunrise")[0], timeZone, "K:mm a")
sunsetTextView.text = dateTime(result2.lookup<Int>("current.sunset")[0], timeZone, "K:mm a")
The expected output is the sunrise/sunset time such as 6:01 AM and 9:05 PM. I am also rendering the current time at the specified place also obtained from the API. As follows:
dateView.text = dateTime(result2.lookup<Int>("current.dt")[0], timeZone)
Which outputs the current date and time at the place in the format "EEE, MMMM d K:mm a" (eg. Mon June 28 8:23 AM).
The current time is always correct, however, there is a problem with the sunrise and sunset times. If I input NYC, for example, the sunrise is 7:35 PM and sunset 10:39 AM. The sunrise and sunset for Tokyo, on the other hand, appears correct at 4:27 AM and 7:00 PM.
Clearly I am missing something as I know the API data is correct. I am looking for any suggestions, however, I would appreciate one which does not have API restrictions such as kotlinx-datetime which requires API 26.
Since there's API Desugaring, you can use java.time with API versions below 26.
That means you don't have to rely on those outdated datetime classes, like java.util.Date and java.text.SimpleDateFormat.
Your fun can be rewritten like this:
fun dateTime(time: Int, zone: String, format: String = "EEE, MMMM d K:mm a"): String {
// parse the time zone
val zoneId = ZoneId.of(zone)
// create a moment in time from the given timestamp (in seconds!)
val instant = Instant.ofEpochSecond(time.toLong())
// define a formatter using the given pattern and a Locale
val formatter = DateTimeFormatter.ofPattern(format, Locale.ENGLISH)
// then make the moment in time consider the zone and return the formatted String
return instant.atZone(zoneId).format(formatter)
}
Here's some example use in a simple fun main():
fun main() {
val timestamp: Int = 1624836905 // your example epoch seconds
// try two different zones
val newYorkTime = dateTime(timestamp, "America/New_York")
val tokyoTime = dateTime(timestamp, "Asia/Tokyo")
// and print the results
println(newYorkTime)
println(tokyoTime)
}
Output of this example:
Sun, June 27 7:35 PM
Mon, June 28 8:35 AM
Please note that you could as well use an offset: Int instead of a zone: String if you simply want to provide an offset of hours from UTC. You would need to adjust two lines of this fun then:
fun dateTime(time: Int, offset: Int, format: String = "EEE, MMMM d K:mm a"): String {
// parse the time zone
val zoneOffset = ZoneOffset.ofHours(offset)
// create a moment in time from the given timestamp (in seconds!)
val instant = Instant.ofEpochSecond(time.toLong())
// define a formatter using the given pattern and a Locale
val formatter = DateTimeFormatter.ofPattern(format, Locale.ENGLISH)
// then make the moment in time consider the zone and return the formatted String
return instant.atOffset(zoneOffset).format(formatter)
}
Using that in a main like this
fun main() {
val timestamp: Int = 1624836905
val newYorkTime = dateTime(timestamp, -4)
val tokyoTime = dateTime(timestamp, 9)
println(newYorkTime)
println(tokyoTime)
}
will produce the very same output.
In addition, the Locale used in the DateTimeFormatter could as well be a function argument in case you want to support different languages (this affects the names of months and days of week).
I have a similar function in Python like this:
def time(self, unix_time, time_zone):
date = datetime.utcfromtimestamp(unix_time + time_zone)
return (datetime.strftime(date, '%I:%M %p'))
Which I call as follows:
WeatherApp.time_zone = self.weather_results['timezone_offset']
print(self.time_date(self.weather_results['current']['dt'], self.time_zone))
print('Sunrise: ' + self.time(self.weather_results['current']['sunrise'], self.time_zone))
print('Sunset: ' + self.time(self.weather_results['current']['sunset'], self.time_zone))
I am trying to get the same result in Kotlin. However comparing the outputs is as follows:
Location: Tokyo, Japan
Current time and date: Tue, June 29 06:53 PM (same in Python and Kotlin from Asia/Tokyo, 1624960598 1624961970
32400)
Sunrise: 04:27 AM (as outputted in Python from 32400, 1624908462)
Sunset: 07:00 PM (as outputted in Python from 32400, 1624960847)
Sunrise: 4:27 AM (as outputted in Kotlin from Asia/Tokyo, 1624908467)
Sunset: 7:00 PM (as outputted in Kotlin from Asia/Tokyo, 1624960846)
---
Location: New York, United States
Current time and date: Tue, June 29 6:02 AM (same in Python and Kotlin from America/New_York, 1624960973)
Sunrise: 05:27 AM (as outputted in Python from -14400, 1624958860)
Sunset: 08:31 PM (as outputted in Python from -14400, 1625013070)
Sunrise: 7:35 PM (as outputted in Kotlin from America/New_York, 1624923330)
Sunset: 10:39 AM (as outputted in Kotlin from America/New_York, 1624977548)
Comparing the timestamps shows that the data obtained from the API differs for some reason. I currently solved it by using a different API. I was using the One Call API by OpenWeather. I can't think of a reason why this is happening, however, by getting the timestamp from a different API the issue no longer persists.

What's the time format of now() in Threeten?

I use ThreeTen module and when I print ZonedDateTime.now(), I get.
2019-07-11T22:43:36.564-07:00[America/Los_Angeles]
What's the format of this?
I tried uuuu-MM-dd'T'HH:mm:ss.SSS'Z' and It says,
org.threeten.bp.format.DateTimeParseException: Text '2019-07-11T22:43:36.564-07:00[America/Los_Angeles]' could not be parsed at index 23
So, after SSS, the 'Z' part is incorrect.
What's the proper way to implement it?
This is my code:
val pstTime = ZonedDateTime.now(ZoneId.of("America/Los_Angeles")).toString()
val timeFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSS'Z'")
val mTime = LocalDateTime.parse(pstTime, timeFormatter).toString()
tv_pstTime.text = mTime
I want to parse it to the format like Tuesday, July 2 5:15:01 P.M.
How can I do that?
You can use DateTimeFormatter.ofPattern("...."). Inside .ofPattern("....") you can have any pattern you want.
Like this:
val result = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"))
.format(DateTimeFormatter.ofPattern("EEEE, MMMM d HH:mm:ss a"))
Output: Thursday, July 11 23:51:21 PM

How would I get a locale-based short date string for Android?

I'm trying to get a date string with the shortened form of the day of week and month, in addition to the day of month.
For example, a user with an English locale would see:
Tue Jun 17
and a user with a German locale would see:
Di. 17 Juni
I've been looking at the android.text.format.DateFormat docs and the getBestDateTimePattern(Locale locale, String skeleton) looked like it might work, but it requires API 18+, so I can't use it.
Is there a way to get this kind of short format that is based on the user's current locale?
Okay, I think I finally figured this out:
int flags = DateUtils.FORMAT_SHOW_DATE |
DateUtils.FORMAT_NO_YEAR |
DateUtils.FORMAT_ABBREV_ALL |
DateUtils.FORMAT_SHOW_WEEKDAY;
dateTextView.setText(DateUtils.formatDateTime(this, millis, flags));
For an English locale, you get:
Wed, Jun 18
and for a German locale, you get:
Mi., 18. Juni
and for a French locale, you get:
mer. 18 juin
You should use getMeduimDateFormat(Context), this obeys the current locale and the user's preferences.
try below code:-
public class DateFormatDemoSO {
public static void main(String args[]) {
int style = DateFormat.MEDIUM;
//Also try with style = DateFormat.FULL and DateFormat.SHORT
Date date = new Date();
DateFormat df;
df = DateFormat.getDateInstance(style, Locale.UK);
System.out.println("United Kingdom: " + df.format(date));
df = DateFormat.getDateInstance(style, Locale.US);
System.out.println("USA: " + df.format(date));
df = DateFormat.getDateInstance(style, Locale.FRANCE);
System.out.println("France: " + df.format(date));
df = DateFormat.getDateInstance(style, Locale.ITALY);
System.out.println("Italy: " + df.format(date));
df = DateFormat.getDateInstance(style, Locale.JAPAN);
System.out.println("Japan: " + df.format(date));
}
}
for more info see the below link :-
http://www.java2s.com/Code/Java/Data-Type/DateFormatwithLocale.htm
Joda-Time
Use the Joda-Time library.
DateTimeFormatter formatter = DateTimeFormat.forStyle( "S-" ).withLocale( java.util.Locale.getDefault() ); // "S" for short date format. "-" to suppress the time portion. Specify locale for cultural rules about how to format a String representation.
DateTime dateTime = new DateTime( someDateObject, DateTimeZone.getDefault() ); // Convert a java.util.Date object to an org.joda.time.DateTime object. Specify time zone to assign to DateTime.
String output = formatter.print( dateTime ); // Generate String representation of date-time value.

Categories

Resources