Как получить дату до недели с этого момента в android в этом формате:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
ex: now 2010-09-19 HH:mm:ss
, до одной недели 2010-09-12 HH:mm:ss
Спасибо
Как получить дату до недели с этого момента в android в этом формате:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
ex: now 2010-09-19 HH:mm:ss
, до одной недели 2010-09-12 HH:mm:ss
Спасибо
Разберите дату:
Date myDate = dateFormat.parse(dateString);
И затем либо выяснить, сколько миллисекунд вам нужно вычесть:
Date newDate = new Date(myDate.getTime() - 604800000L); // 7 * 24 * 60 * 60 * 1000
Или используйте API, предоставляемый классом java.util.Calendar
:
Calendar calendar = Calendar.getInstance();
calendar.setTime(myDate);
calendar.add(Calendar.DAY_OF_YEAR, -7);
Date newDate = calendar.getTime();
Затем, если вам нужно, верните его в String:
String date = dateFormat.format(newDate);
Я создал свою собственную функцию, которая может помочь получить следующую/предыдущую дату из
Текущая дата:
/**
* Pass your date format and no of days for minus from current
* If you want to get previous date then pass days with minus sign
* else you can pass as it is for next date
* @param dateFormat
* @param days
* @return Calculated Date
*/
public static String getCalculatedDate(String dateFormat, int days) {
Calendar cal = Calendar.getInstance();
SimpleDateFormat s = new SimpleDateFormat(dateFormat);
cal.add(Calendar.DAY_OF_YEAR, days);
return s.format(new Date(cal.getTimeInMillis()));
}
Пример:
getCalculatedDate("dd-MM-yyyy", -10); // It will gives you date before 10 days from current date
getCalculatedDate("dd-MM-yyyy", 10); // It will gives you date after 10 days from current date
и если вы хотите получить расчетную дату с передачей свою собственную дату:
public static String getCalculatedDate(String date, String dateFormat, int days) {
Calendar cal = Calendar.getInstance();
SimpleDateFormat s = new SimpleDateFormat(dateFormat);
cal.add(Calendar.DAY_OF_YEAR, days);
try {
return s.format(new Date(s.parse(date).getTime()));
} catch (ParseException e) {
// TODO Auto-generated catch block
Log.e("TAG", "Error in Parsing Date : " + e.getMessage());
}
return null;
}
Пример с передачей собственной даты:
getCalculatedDate("01-01-2015", "dd-MM-yyyy", -10); // It will gives you date before 10 days from given date
getCalculatedDate("01-01-2015", "dd-MM-yyyy", 10); // It will gives you date after 10 days from given date
LocalDate
.now( ZoneId.of( "Pacific/Auckland" ) ) // Get the date-only value for the current moment in a specified time zone.
.minusWeeks( 1 ) // Go back in time one week.
.atStartOfDay( ZoneId.of( "Pacific/Auckland" ) ) // Determine the first moment of the day for that date in the specified time zone.
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // Generate a string in standard ISO 8601 format.
.replace( "T" , " " ) // Replace the standard "T" separating date portion from time-of-day portion with a SPACE character.
В современном подходе используются классы java.time.
Класс LocalDate
представляет значение даты только без времени и без часового пояса.
Часовой пояс имеет решающее значение для определения даты. В любой данный момент дата изменяется по всему миру по зонам. Например, через несколько минут после полуночи в Париж Франция - это новый день, пока еще "вчера" в Монреаль Квебек.
Укажите имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте аббревиатуру 3-4 буквы, например EST
или IST
, поскольку они не являются настоящими часовыми поясами, а не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.forID( "America/Montreal" ) ;
LocalDate now = LocalDate.now ( z ) ;
Произведите некоторую математику, используя методы minus…
и plus…
.
LocalDate weekAgo = now.minusWeeks( 1 );
Пусть java.time определит первый момент дня для вашего желаемого часового пояса. Не предполагайте, что день начинается с 00:00:00
. Аномалии, такие как переход на летнее время, означают, что день может начинаться в другое время суток, например 01:00:00
.
ZonedDateTime weekAgoStart = weekAgo.atStartOfDay( z ) ;
Создайте строку, представляющую этот объект ZonedDateTime
, используя объект DateTimeFormatter
. Поиск для многих других обсуждений этого класса.
DateTimeFormatter f = DateTimeFormatter.ISO_LOCAL_DATE_TIME ;
String output = weekAgoStart.format( f ) ;
Этот стандартный формат близок к тому, что вы хотите, но имеет T
в середине, где вы хотите SPACE. Поэтому замените SPACE на T
.
output = output.replace( "T" , " " ) ;
Структура java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь режим обслуживания, советуем перейти к классам java.time.
Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация JSR 310.
Где получить классы java.time?
Обновление: Проект Joda-Time теперь находится в режиме обслуживания. Команда советует перейти на классы java.time.
Использование библиотеки Joda-Time упрощает работу с датой.
Обратите внимание на использование часового пояса. Если вы опустили, вы работаете в UTC или в текущем часовом поясе JVM.
DateTime now = DateTime.now ( DateTimeZone.forID( "America/Montreal" ) ) ;
DateTime weekAgo = now.minusWeeks( 1 );
DateTime weekAgoStart = weekAgo.withTimeAtStartOfDay();
Я вижу два пути:
Используйте GregorianCalendar:
Calendar someDate = GregorianCalendar.getInstance();
someDate.add(Calendar.DAY_OF_YEAR, -7);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = dateFormat.format(someDate);
Используйте android.text.format.Time:
long yourDateMillis = System.currentTimeMillis() - (7 * 24 * 60 * 60 * 1000);
Time yourDate = new Time();
yourDate.set(yourDateMillis);
String formattedDate = yourDate.format("%Y-%m-%d %H:%M:%S");
Решение 1 является "официальным" способом java, но использование GregorianCalendar может иметь серьезные проблемы с производительностью, поэтому инженеры Android добавили объект android.text.format.Time, чтобы исправить это.
public static Date getDateWithOffset(int offset, Date date){
Calendar calendar = calendar = Calendar.getInstance();;
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, offset);
return calendar.getTime();
}
Date weekAgoDate = getDateWithOffset(-7, new Date());
добавить библиотеку Joda
implementation 'joda-time:joda-time:2.10'
'
'DateTime now = new DateTime();
DateTime weekAgo = now.minusWeeks(1);
Date weekAgoDate = weekAgo.toDate()// if you want to convert it to Date
Используйте API Java 8 или ThreeTenABP для Android (minSdk & lt; 24).
ThreeTenABP:
implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'
'
'LocalDate now= LocalDate.now();
now.minusWeeks(1);
Вы можете использовать этот код для получения точной строки, которую вы хотите.
object DateUtil{
fun timeAgo(context: Context, time_ago: Long): String {
val curTime = Calendar.getInstance().timeInMillis / 1000
val timeElapsed = curTime - (time_ago / 1000)
val minutes = (timeElapsed / 60).toFloat().roundToInt()
val hours = (timeElapsed / 3600).toFloat().roundToInt()
val days = (timeElapsed / 86400).toFloat().roundToInt()
val weeks = (timeElapsed / 604800).toFloat().roundToInt()
val months = (timeElapsed / 2600640).toFloat().roundToInt()
val years = (timeElapsed / 31207680).toFloat().roundToInt()
// Seconds
return when {
timeElapsed <= 60 -> context.getString(R.string.just_now)
minutes <= 60 -> when (minutes) {
1 -> context.getString(R.string.x_minute_ago, minutes)
else -> context.getString(R.string.x_minute_ago, minutes)
}
hours <= 24 -> when (hours) {
1 -> context.getString(R.string.x_hour_ago, hours)
else -> context.getString(R.string.x_hours_ago, hours)
}
days <= 7 -> when (days) {
1 -> context.getString(R.string.yesterday)
else -> context.getString(R.string.x_days_ago, days)
}
weeks <= 4.3 -> when (weeks) {
1 -> context.getString(R.string.x_week_ago, weeks)
else -> context.getString(R.string.x_weeks_ago, weeks)
}
months <= 12 -> when (months) {
1 -> context.getString(R.string.x_month_ago, months)
else -> context.getString(R.string.x_months_ago, months)
}
else -> when (years) {
1 -> context.getString(R.string.x_year_ago, years)
else -> context.getString(R.string.x_years_ago, years)
}
}
}
}