我对split()
方法有疑问。我正在解析API的响应,并将时间分为几个小时和几分钟。我发现split()
给了我错误的值。我在调试时为代码制作了屏幕截图,以向您展示:
您可以看到time
的值为“ 08:15”,而tTime[0]
的值为“”。
奇怪的是,在解析时,我在time
循环中得到了for
,当我阅读第10项时得到了“ 08:15”;从0到8都可以。我的代码或split()
方法本身有问题吗?
@NonNull
public static String increaseTimeString(String time, int valHours, int valMinutes, boolean saveToDB, String ID, Context context, TimeSavingColumn column){ // time (hh:mm) // czas pojawienia się zadania + czas na akceptację
String[] tTime = time.split(":");
String hour = tTime[0];
String minute = tTime[1];
tTime = null;
if(hour.startsWith("0")) {
tTime = hour.split("0");
if(tTime.length > 0) hour = tTime[0];
else hour = "0";
}
tTime = null;
if(minute.startsWith("0")) {
tTime = minute.split("0");
if (tTime.length > 0) minute = tTime[0];
else minute = "0";
}
int iHour = Integer.parseInt(hour);
int iMinute = Integer.parseInt(minute);
if(valMinutes != -1){
iMinute = iMinute + valMinutes;
while (iMinute >= 60){
iMinute = iMinute - 60;
iHour++;
}
}
int days = 0;
iHour = iHour + valHours;
String day = String.valueOf(days);
if (iHour < 10 && iHour > 0) {
hour = "0" + String.valueOf(iHour);
} else {
hour = String.valueOf(iHour);
}
if (iMinute < 10) {
minute = "0" + String.valueOf(iMinute);
} else {
minute = String.valueOf(iMinute);
}
if(saveToDB){
DBAcceptedTasks database = new DBAcceptedTasks(context);
database.open();
String actualTime = hour + ":" + minute;
if (column == TimeSavingColumn.START)database.updateTask(ID, null, null, null, null, -1, -1, -1, -1, -1, -1, actualTime, null, null);
if (column == TimeSavingColumn.END)database.updateTask(ID, null, null, null, null, -1, -1, -1, -1, -1, -1, null, actualTime, null);
if (column == TimeSavingColumn.END)database.updateTask(ID, null, null, null, null, -1, -1, -1, -1, -1, -1, null, null, actualTime);
}
return hour + ":" + minute;
}
答案 0 :(得分:1)
这部分有问题:
if(hour.startsWith("0")) {
tTime = hour.split("0");
if(tTime.length > 0) hour = tTime[0];
else hour = "0";
}
因此,如果您输入的是“ 08:15”,则小时值为“ 08”。现在,当使用定界符“ 0”分割它时,将得到一个数组{ "", "8" }
。因此,现在tTime [0]为“”。
改为使用:
if(hour.startsWith("0")) {
hour = hour.substring(1);
}
PS:如果小时数不是以“ 0”开头,则没有问题。
答案 1 :(得分:1)
split
方法可以很好地工作,但是然后您会有一个以if (hour.startsWith("0"))
开头的代码块,它们会弄乱数字。
Integer.parseInt
不介意带有前导零的数字。它不会爆炸,不会被当作八进制或以其他方式发出抱怨,因此如果hour.startsWith("0")
,您不需要做任何特别的事情。
另外,操纵时间要容易得多,因为整数int是分钟数,而不是小时数和分钟数。将单个int转换回小时,分钟和天,或仅用于格式化和显示的任何内容:
public static String increaseTimeString(
String time, int minutesToAdd,
boolean saveToDB, String ID, Context context, TimeSavingColumn column) {
String[] parts = time.split(":");
int minutes = (Integer.parseInt(parts[0]) * 60) + Integer.parseInt(parts[1]) + minutesToAdd;
time = String.format("%02d:%02d", (minutes / 60) % 24, minutes % 60);
if (saveToDB) {
DBAcceptedTasks database = new DBAcceptedTasks(context);
database.open();
database.updateTask(ID, null, null, null, null,
-1, -1, -1, -1, -1, -1,
column == TimeSavingColumn.START ? time : null,
column == TimeSavingColumn.END ? time : null,
column == TimeSavingColumn.END ? time : null);
}
return time;
}
答案 2 :(得分:0)
问题出在代码中,请尝试
"1.23+1"
处理此问题的最佳方法是将小时和分钟转换为整数。
答案 3 :(得分:0)
在您的代码中,+
行之后
数组tTime的状态为if(hour.startsWith("0")) {
tTime = hour.split("0");
if(tTime.length > 0) hour = tTime[1];//index should be 1
else hour = "0";
}
tTime = null;
if(minute.startsWith("0")) {
tTime = minute.split("0");
if (tTime.length > 0) minute = tTime[1];//index should be 1
else minute = "0";
}
因此import pandas as pd
df = pd.DataFrame()
df['Date'] = ['6/24/2019','6/14/2019','2019-09-06 00:00:00','6/14/2019','6/14/2019']
df['newDate'] = pd.to_datetime(df['Date'])
print (df)
Date newDate
0 6/24/2019 2019-06-24
1 6/14/2019 2019-06-14
2 2019-09-06 00:00:00 2019-09-06
3 6/14/2019 2019-06-14
4 6/14/2019 2019-06-14
之后的小时是数组tTime的第0个索引,即“”。