我正在编写一个Android应用程序,我需要知道商店是否在特定时间范围内打开。我已经使用下面的代码了:
try {
Date time1 = new SimpleDateFormat("HH:mm:ss").parse(getResources().getString(R.string.opening_time));
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(time1);
Date time2 = new SimpleDateFormat("HH:mm:ss").parse(getResources().getString(R.string.closing_time));
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(time2);
calendar2.add(Calendar.DATE, 1);
Date current = new SimpleDateFormat("HH:mm:ss").parse(getCurrentTime());
Calendar calendar3 = Calendar.getInstance();
calendar3.setTime(d);
calendar3.add(Calendar.DATE, 1);
Date x = current.getTime();
if (x.after(calendar1.getTime()) && x.before(calendar2.getTime())) {
isOpened = true;
}
} catch (ParseException e) {
e.printStackTrace();
} finally {
return isOpened;
}
此代码的问题在于他没有考虑时区。
time1和time2分别是开启和关闭时间,它们基于PST时区。现在它们的定义如下:
<string name="opening_time">06:00:00</string>
<string name="closing_time">18:00:00</string>
它们基于24小时格式而未指定时区。由于开放时间总是基于相同的时区,我可以根据需要以编程方式进行设置。
如果商店处于打开状态并考虑时区,我该如何使其正常回复true或false。由于我的商店从太平洋标准时间早上6点到下午6点开放,如果有人试图在美国东部时间晚上8点进入,那应该是好的。
我对API 19的支持率最低
由于
答案 0 :(得分:0)
如果您设置时间 UTC ,则所有时区的时间都相同 尝试这样的事情:
SimpleDateFormat SM_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS")
SM_DF_POST_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
答案 1 :(得分:0)
最简单的方法是将整个计算保留在商店的时区中,这样您就不需要在时区之间进行任何转换:
// POST: Fabric/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see https://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "FabricId,MainCategory,MainCategoryId, SubCategory1Id,SubCategory1,SubCategory2,Name,ImagePath,Location,Type,Weight,Content,Design,Brand,Quantity,Width,Source,Notes,ItemsSold")] Fabric fabric, HttpPostedFileBase file)
{
if (ModelState.IsValid)
{
var filename = Path.GetFileName(file.FileName);
string fabricId = fabric.FabricId.ToString();
string myfile = fabricId + "_" + filename;
var path = Path.Combine(Server.MapPath("~/images"), myfile);
fabric.ImagePath = myfile;
file.SaveAs(path);
db.Fabrics.Add(fabric);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(fabric);
}
我刚刚在计算机上运行此代码。当地时间(欧洲/哥本哈根时区)是21:31,相当于洛杉矶的12:31。该片段打印出来:
商店是否开放?真
只要设备时钟正确,代码就与设备时区无关。
我正在使用并推荐import org.threeten.bp.LocalTime;
import org.threeten.bp.ZoneId;
public class IsStoreInOtherTimeZoneOpen {
public static void main(String[] args) {
ZoneId storeTimeZone = ZoneId.of("America/Los_Angeles");
LocalTime openingTime = LocalTime.parse("06:00:00");
LocalTime closingTime = LocalTime.parse("18:00:00");
LocalTime nowInStore = LocalTime.now(storeTimeZone);
boolean isOpen = nowInStore.isAfter(openingTime) && nowInStore.isBefore(closingTime);
System.out.println("Is store open? " + isOpen);
}
}
,现代Java日期和时间API。
是的,java.time
适用于较旧和较新的Android设备。它只需要至少Java 6 。
java.time
和java.time.LocalTime
(不是上面使用的java.time.ZoneId
中的类)。org.threeten.bp
导入日期和时间类。我被告知要使用的依赖项是org.threeten.bp
。compile group: 'org.threeten', name: 'threetenbp', version: '1.3.3', classifier: 'no-tzdb'
。java.time
。java.time
向Java 6和7的后端(JST-310的ThreeTen)。