cuốn sách gpt4 ai đã làm

SimpleDateFormat hoạt động kỳ lạ trong Android

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 12:38:46 28 4
mua khóa gpt4 Nike

Dưới đây là mã tôi sử dụng để lấy 00 giờ trong ngày (dạng dài).

Tôi đang chạy đoạn mã sau trong android.

Phương pháp này trả về giá trị chính xác trong hầu hết các trường hợp. Nhưng đôi khi nó quay trở lại Giá trị của System.currentTimeMillis() .

nhập java.text.SimpleDateFormat;
nhập java.util.Date;
công khai tĩnh cuối cùng SimpleDateFormat SD_FORMAT_DAY_MONTH_YEAR = SimpleDateFormat mới("dd/MM/yyyy");


công khai tĩnh dài getLongForCurrent00hr() {
Ngày ngày = Ngày mới();
Thời gian chuỗi = SD_FORMAT_DAY_MONTH_YEAR.format(ngày);

giá trị dài;
thử {
Ngày date2 = SD_FORMAT_DAY_MONTH_YEAR .parse(time);
giá trị = date2.getTime();
} bắt (ParseException e) {
giá trị = 0;
}
giá trị trả về;
}

Tại sao trở lại System.currentTimeMillis() ?
Làm thế nào tôi có thể giải quyết vấn đề này?

Tôi quan tâm nhiều hơn đến việc biết tại sao...

Khi tôi chạy mã này ngày hôm nay, tôi đã kiểm tra nó bằng cách gõ nhật ký:

Hầu hết thời gian nó sẽ trả về: 1462386600000

một vài lần nữa System.currentTimeMillis() Giống như 1462430867302.

câu trả lời hay nhất

Mã mẫu của bạn hoạt động

Tôi không nghĩ có gì sai với mã của bạn khi bạn xây dựng nó (đọc phần nhận xét bên dưới).

Hầu như mã chính xác của bạn được hiển thị ở đây. Hai thay đổi:

  • Tôi đã biến định dạng của bạn thành một biến cục bộ. (Để làm cho bản demo này dễ dàng hơn, bạn có thể sao chép và dán một đoạn mã)
  • Tôi đã thêm một vài cuộc gọi để nhận được Lập tức ,UTC Thời điểm hiện tại trong . java.util.Date , Nhưng Tức thì::toStringTạo một chuỗi hiển thị UTC thay vì áp dụng múi giờ hiện tại của JVM một cách khó hiểu. Vì vậy, bạn có thể thấy rõ hơn rằng bạn có được khoảnh khắc đầu tiên của múi giờ mặc định hiện tại của JVM. Trong trường hợp tôi chạy mã này, múi giờ mặc định hiện tại của JVM của tôi là Mỹ/Los_Angeles , Hiện nay bù đắp từ UTC Giờ tiết kiệm ánh sáng ban ngày (DST) cho -07:00 (Bảy giờ sau UTC).

  • Mã mẫu.
    Ngày date1 = Ngày mới ();
    SimpleDateFormat SD_FORMAT_DAY_MONTH_YEAR = SimpleDateFormat mới ("dd/MM/yyyy" );
    Thời gian chuỗi = SD_FORMAT_DAY_MONTH_YEAR.format ( date1 );

    Ngày date2 = null;
    giá trị dài;
    thử {
    date2 = SD_FORMAT_DAY_MONTH_YEAR.parse ( thời gian );
    giá trị = date2.getTime();
    } bắt (ParseException e) {
    giá trị = 0;
    }
    System.out.println ("date1: " + date1 + " date2: " + date2 + " value: " + value + " | tức thời 1: " + date1.toInstant() + " | tức thời 2: " + date2.toInstant () );

    Trong khi chạy.

    ngày1: Thứ năm ngày 05 tháng 5 16:55:40 PDT 2016 ngày2: Thứ năm ngày 05 tháng 5 00:00:00 PDT năm 2016 giá trị: 1462431600000 | ngay lập tức 1: 2016-05-05T23:55:40.907Z | 2016-05-05T07:00:00Z



    làm việc quá chăm chỉ

    Câu hỏi của bạn thật khó hiểu nhưng có vẻ như bạn đang cố gắng ghi lại khoảnh khắc đầu tiên trong ngày. Bạn đang đi sai hướng, làm việc quá sức.

    múi giờ

    Mã của bạn dường như đang sử dụng java.util.Datelớp học. Lớp này đại diện cho một khoảnh khắc trên dòng thời gian UTC.

    Nhưng bạn không có được khoảnh khắc đầu tiên trong ngày ở UTC. Khi bạn phân tích chuỗi ngày đó để tạo chuỗi mới java.util.Date (giá trị ngày cộng với thời gian, mặc dù có tên gây hiểu nhầm), múi giờ mặc định hiện tại của JVM được áp dụng ngầm. Việc đưa các múi giờ vào quy trình một cách vô hình là rất khó hiểu.

    Thay vào đó, bạn nên cân nhắc múi giờ một cách có ý thức và luôn nói rõ rằng múi giờ đó là mã hóa của bạn (như hiển thị bên dưới).

    java.time

    java.util.Date/ .LịchCác lớp học đã được chứng minh là được thiết kế kém, khó hiểu và cồng kềnh. Bây giờ họ bị bỏ lại phía sau và java.time thay thế. Framework được tích hợp vào Java 8 trở lên. Hầu hết các chức năng của java.time là được chuyển ngược sang Java 6 & 7thích nghi hơn nữa cho Android .

    Đối với các giá trị chỉ ngày không có thời gian và múi giờ, hãy sử dụng Ngày địa phương lớp học. Mặc dù múi giờ không được lưu trữ nhưng việc xác định ngày chẳng hạn như "hôm nay" cần có múi giờ. Nếu bị bỏ qua, múi giờ mặc định hiện tại của JVM sẽ được áp dụng (lưu ý rằng mặc định này có thể thay đổi bất kỳ lúc nào trong thời gian chạy).
    ZoneId ZoneId = ZoneId.of( "Mỹ/Montreal" );
    LocalDate hôm nay = LocalDate.now(zoneId );

    Bạn dường như muốn khoảnh khắc đầu tiên trong ngày. Đừng cho rằng thời điểm đó là 00:00:00.0 .Mặc dù nói chung là đúng, nhưng ở một số múi giờ, những điểm bất thường như giờ tiết kiệm ánh sáng ban ngày có thể chuyển múi giờ sang thời gian khác. Hãy để java.time xác định thời gian chính xác. gọi [ tạiStartOfDay[2]生成 Ngày giờ được khoanh vùng Khoảnh khắc đầu tiên phù hợp với múi giờ đã chỉ định.
    ZonedDateTime zdt = hôm nay.atStartOfDay(zoneId);

    Tôi thực sự khuyên bạn không nên sử dụng việc xử lý các giá trị ngày giờ dưới dạng đếm - kỷ nguyên .Điều này giống như sử dụng một mảng số nguyên các điểm mã Unicode thay vì sử dụng các lớp liên quan đến chuỗi để xử lý văn bản. Nhưng nếu bạn nhất quyết, bạn có thể chuyển đổi. Nhưng hãy cẩn thận với việc mất dữ liệu, vì lớp java.time có độ phân giải nano giây tốt hơn, trong khi bạn đang yêu cầu mili giây (một trong nhiều lý do để tránh coi thời gian là tính từ kỷ nguyên). Đầu tiên trích xuất một Lập tức , khoảnh khắc trên dòng thời gian UTC, với độ phân giải nano giây.
    Tức thì tức thì = zdt.toInstant();
    mili giây dàiFromEpoch = instant.toEpochMilli(); // CẢNH BÁO: Có thể mất dữ liệu (từ nano giây đến mili giây).

    UTC

    Nếu bạn thực sự muốn khoảnh khắc đầu tiên ở UTC, điều đó cũng thật dễ dàng.

    Bạn có thể sử dụng hằng số ZoneOffset.UTC Chỉ định UTC làm múi giờ. (Hằng số này xảy ra ở Khu vực bù đắp trong, nó là ZoneId tiểu thể loại. )
    ZonedDateTime zdt = hôm nay.atStartOfDay( ZoneOffset.UTC );

    Nhưng đây có thể không phải là con đường thích hợp nhất. múi giờ là bù đắp từ UTCcộng với một bộ quy tắc ngoại lệ, ví dụ: Giờ tiết kiệm ánh sáng ban ngày (DST) .Theo định nghĩa, UTC không có những điều bất thường như vậy. Vì vậy sẽ thích hợp hơn để OffsetDateTime thay vì Ngày giờ được khoanh vùng .
    OffsetTime ot = OffsetTime.of( 0 , 0 , 0 , 0 , ZoneOffset.UTC );
    OffsetDateTime odt = hôm nay.atTime(ot);

    Về java - SimpleDateFormat hoạt động kỳ lạ trong Android, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/37044443/

    28 4 0
    không gian vũ trụ
    Hồ sơ

    Tôi là một lập trình viên xuất sắc, rất giỏi!

    Nhận phiếu giảm giá taxi Didi miễn phí
    Phiếu giảm giá taxi Didi
    Chứng chỉ ICP Bắc Kinh số 000000
    Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
    Xem sitemap của VNExpress