Java 还有几天
我需要从一个日期到第二个日期进行倒计时 e、 gJava 还有几天,java,android,time,Java,Android,Time,我需要从一个日期到第二个日期进行倒计时 e、 g 当前日期:2013年3月1日下一个日期:2013年1月21日 然后显示::17天剩余时间 我实现了这样的代码 String inputDateString = "01/22/2013"; Calendar calCurr = Calendar.getInstance(); Calendar calNext = Calendar.getInstance(); calNext.setTime(new Date(inputDateString));
当前日期:2013年3月1日
下一个日期:2013年1月21日
然后显示::17天剩余时间
我实现了这样的代码
String inputDateString = "01/22/2013";
Calendar calCurr = Calendar.getInstance();
Calendar calNext = Calendar.getInstance();
calNext.setTime(new Date(inputDateString));
if(calNext.after(calCurr))
{
long timeDiff = calNext.getTimeInMillis() - calCurr.getTimeInMillis();
int daysLeft = (int) (timeDiff/DateUtils.DAY_IN_MILLIS);
dni.setText("Days Left: "+daysLeft);
}
else
{
long timeDiff = calCurr.getTimeInMillis() - calNext.getTimeInMillis();
timeDiff = DateUtils.YEAR_IN_MILLIS - timeDiff;
int daysLeft = (int) (timeDiff/DateUtils.DAY_IN_MILLIS);
}
有没有更好的方法来实现这些目标?有几个库可以将日期转换为
n天
格式:
String inputDateString = "01/22/2013";
Calendar calCurr = Calendar.getInstance();
Calendar day = Calendar.getInstance();
day.setTime(new SimpleDateFormat("MM/dd/yyyy").parse(inputDateString));
if(day.after(calCurr)){
System.out.println("Days Left: " + (day.get(Calendar.DAY_OF_MONTH) -(calCurr.get(Calendar.DAY_OF_MONTH))) );
}
产出:剩余天数:17
要将年份增加1,可以使用Calendar.add()方法
我使用这个类
import android.text.format.DateUtils;
import java.util.Date;
import static android.text.format.DateUtils.FORMAT_NUMERIC_DATE;
import static android.text.format.DateUtils.FORMAT_SHOW_DATE;
import static android.text.format.DateUtils.FORMAT_SHOW_YEAR;
import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
/**
* Utilities for dealing with dates and times
*/
public class TimeUtils {
/**
* Get relative time for date
*
* @param date
* @return relative time
*/
public static CharSequence getRelativeTime(final Date date) {
long now = System.currentTimeMillis();
if (Math.abs(now - date.getTime()) > 60000)
return DateUtils.getRelativeTimeSpanString(date.getTime(), now,
MINUTE_IN_MILLIS, FORMAT_SHOW_DATE | FORMAT_SHOW_YEAR
| FORMAT_NUMERIC_DATE);
else
return "Just now";
}
}
TimeUtils.getRelativeTime(日期)
返回类似于刚才,
2分钟前,
2小时前,
2天前,
2013年11月4日我在互联网上搜索了这段代码,但没有找到。虽然我回复得很晚,但这将是一段有用的代码
public static String getTimeLeft(String date) { // dateFormat = "yyyy-MM-dd"
String[] DateSplit = date.split("-");
int month = Integer.parseInt(DateSplit[1]) - 1, // if month is november then subtract by 1
year = Integer.parseInt(DateSplit[0]), day = Integer
.parseInt(DateSplit[2]), hour = 0, minute = 0, second = 0;
Calendar now = Calendar.getInstance();
int sec = second - Calendar.getInstance().get(Calendar.SECOND), min = minute
- Calendar.getInstance().get(Calendar.MINUTE), hr = hour
- Calendar.getInstance().get(Calendar.HOUR_OF_DAY), dy = day
- Calendar.getInstance().get(Calendar.DATE), mnth = month
- Calendar.getInstance().get(Calendar.MONTH), daysinmnth = 32 - dy;
Calendar end = Calendar.getInstance();
end.set(year, month, day);
if (mnth != 0) {
if (dy != 0) {
if (sec < 0) {
sec = (sec + 60) % 60;
min--;
}
if (min < 0) {
min = (min + 60) % 60;
hr--;
}
if (hr < 0) {
hr = (hr + 24) % 24;
dy--;
}
if (dy < 0) {
dy = (dy + daysinmnth) % daysinmnth;
mnth--;
}
if (mnth < 0) {
mnth = (mnth + 12) % 12;
}
}
}
String hrtext = (hr == 1) ? "hour" : "hours", dytext = (dy == 1) ? "day"
: "days", mnthtext = (mnth == 1) ? "month" : "months";
if (now.after(end)) {
return "";
} else {
String months = "", days = "", hours = "";
months = (mnth > 0) ? mnth + " " + mnthtext : "";
if (mnth <= 0) {
days = (dy > 0) ? dy + " " + dytext : "";
if (dy <= 0) {
hours = (hr > 0) ? hr + " " + hrtext : "";
}
}
//Log.d("DATE", months + " 1 " + days + " 2 " + hours);
return months + days + hours;
}
}
公共静态字符串getTimeLeft(字符串日期){//dateFormat=“yyyy-MM-dd”
字符串[]DateSplit=date.split(“-”);
int month=Integer.parseInt(DateSplit[1])-1,//如果月份是11月,则减去1
year=Integer.parseInt(DateSplit[0]),day=Integer
.parseInt(DateSplit[2]),小时=0,分钟=0,秒=0;
Calendar now=Calendar.getInstance();
int sec=second-Calendar.getInstance().get(Calendar.second),min=min
-Calendar.getInstance().get(Calendar.MINUTE),hr=hour
-Calendar.getInstance().get(Calendar.HOUR\u OF_DAY),dy=DAY
-Calendar.getInstance().get(Calendar.DATE),mnth=month
-Calendar.getInstance().get(Calendar.MONTH),daysinmnth=32-dy;
日历结束=Calendar.getInstance();
结束。设置(年、月、日);
如果(mnth!=0){
如果(dy!=0){
如果(秒<0){
秒=(秒+60)%60;
闵--;
}
如果(最小值<0){
最小=(最小+60)%60;
人力资源--;
}
如果(hr<0){
心率=(心率+24)%24;
dy--;
}
if(dy<0){
dy=(dy+daysinmnth)%daysinmnth;
mnth--;
}
if(mnth<0){
mnth=(mnth+12)%12;
}
}
}
字符串hrtext=(hr==1)?“小时”:“小时”,dytext=(dy==1)?“天”
:“天”,mnthtext=(mnth==1)?“月”:“月”;
如果(现在,在(结束)之后){
返回“”;
}否则{
字符串月份=”,天=”,小时=”;
月份=(mnth>0)?mnth+“”+mnth文本:“”;
如果(mnth 0)?dy+“”+dytext:“”;
如果(dy 0)?hr+“”+hr文本:“”;
}
}
//日志d(“日期”,月份+“1”+天+“2”+小时);
返回月+天+小时;
}
}
其他答案忽略了时区,这可能是至关重要的,取决于您希望倒计时的准确性。如果未指定时区,则将获得的默认值为 众所周知,java.util.Date和.Calendar类非常麻烦。避开它们。在中使用或新的 2.3中的一段代码,未经测试(在我的脑海中)。搜索StackOverflow以获取更多示例
String input = "01/22/2013";
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTimeFormatter formatterInput = DateTimeFormat.forPattern( "MM/dd/yyyy" ).withZone( timeZone );
DateTime future = formatterInput.parseDateTime( input );
DateTime now = new DateTime( timeZone );
int days = Days.daysBetween( now, future ).getDays();
Interval interval = new Interval( now, future );
Period period = new Period( interval );
对这些变量执行一些System.out.println
调用,您会大吃一惊
您将看到的字符串格式是。您还可以创建其他格式。tl;博士
java.time
现代方法使用java.time类
LocalDate
该类表示一个仅限日期的值,不包含一天中的时间和时区
确定你的日期
LocalDate start = LocalDate.of( 2013 , Month.JANUARY , 3 ) ; // 3/1/2013
LocalDate stop = LocalDate.of( 2013 , Month.JANUARY , 21 ) ; // 21/01/2013
今天的日期
时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”
如果未指定时区,JVM将隐式应用其当前默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将所需/预期时区明确指定为参数
以大陆/地区
的格式指定,例如,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)
过去的日子
计算不同粒度的运行时间
long daysElapsed = ChronoUnit.DAYS.between( start , stop ) ;
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 该项目现已启动,建议迁移到类 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 从哪里获得java.time类
- ,及以后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看
java.util.date
、java.util.Calendar
、和java.text.SimpleDateFormat
等令人烦恼的旧日期时间类现在已经遗留下来,被这些类所取代。大部分java.time功能都在项目中向后移植到Java6和Java7。进一步适应项目中早期的Android。请参阅。您可以使用两个日期之间的差(日历。月中日)。当差值超过1个月时,我返回的天数错误。是的,这只适用于sa内的天数
LocalDate start = LocalDate.of( 2013 , Month.JANUARY , 3 ) ; // 3/1/2013
LocalDate stop = LocalDate.of( 2013 , Month.JANUARY , 21 ) ; // 21/01/2013
ZoneId z = ZoneId.of( "America/Montreal" ) ; // Or `ZoneId.systemDefault()` to indicate explicitly that you want the JVM’s current default time zone. Beware of that default changing *during* runtime.
LocalDate today = LocalDate.now( z ) ;
long daysElapsed = ChronoUnit.DAYS.between( start , stop ) ;