có ai có mẫu regex tốt để khớp với thời gian biểu không?javascript regex iso datetime
ví dụ: 2010-06-15T00: 00: 00
có ai có mẫu regex tốt để khớp với thời gian biểu không?javascript regex iso datetime
ví dụ: 2010-06-15T00: 00: 00
Đối với, datetime toàn nghiêm ngặt, trong đó có phần nghìn giây, mỗi the W3C's take on the spec:.
//-- Complete precision:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/
//-- No milliseconds:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)/
//-- No Seconds:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)/
//-- Putting it all together:
/(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))/
.
biến thể bổ sung cho phép bởi thực tế ISO 8601:2004(E) doc:
/********************************************
** No time-zone varients:
*/
//-- Complete precision:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+/
//-- No milliseconds:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d/
//-- No Seconds:
/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d/
//-- Putting it all together:
/(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+)|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d)|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d)/
Chú ý: Điều này tất cả trở nên lộn xộn nhanh chóng, và nó vẫn phép vô nghĩa nhất định như một tháng 14. Ngoài ra, ISO 8601: 2004 (E) cho phép một số biến thể khác.
.
"2010-06-15T00: 00: 00" không hợp pháp vì không có chỉ định múi giờ.
ISO-8601 nói rằng nếu múi giờ bị bỏ qua, nó được giả định là UTC, điều này bao gồm 'Z'. –
@Scott S. McCoy: Tôi đã giải thích cách giải thích của W3C (http://www.w3.org/TR/NOTE-datetime) như một nhà phát triển web giỏi. ;-) Tôi cũng không coi Wikipedia là một nguồn dứt khoát. Nhưng bạn đúng. Theo thông số thực tế (http://dotat.at/tmp/ISO_8601-2004_E.pdf), chênh lệch múi giờ là tùy chọn. –
Tôi hết lòng đồng ý rằng Wikipedia không phải là một nguồn dứt khoát. Nhưng đối với một số chủ đề nó làm cho một tài liệu tham khảo hợp lý, và bài viết trên ISO-8601 có các ví dụ ngon miệng và giải thích tiêu hóa. :-D –
Không chắc chắn nó có liên quan đến vấn đề cơ bản mà bạn đang cố gắng giải quyết hay không, nhưng bạn có thể chuyển chuỗi ngày ISO thành một hàm tạo arg đến Date() và lấy một đối tượng ra khỏi nó. Hàm khởi tạo thực sự rất linh hoạt về việc ép một chuỗi vào một ngày tháng.
Thực ra, không, bạn không thể. http://ideone.com/YDmgu –
Xác nhận, cách tiếp cận đó không hoạt động. Vấn đề là với IE. 2014-06-44 trở thành 2014-08-13 vì IE xử lý ngày tràn (> 30) là ngày tháng tiếp theo.Tôi đã thử trong IE8 và IE11. Hoạt động trong Chrome. Rất phiền phức. – mortb
Đặc điểm ISO 8601 cho phép nhiều định dạng ngày khác nhau. Có một lời giải thích tầm thường về cách làm điều đó here. Có sự khác biệt khá nhỏ giữa cách định dạng đầu vào ngày của Javascript và định dạng ISO cho các ngày đơn giản không chỉ định múi giờ và có thể dễ dàng giảm nhẹ bằng cách sử dụng string substitution. Hỗ trợ đầy đủ các đặc điểm kỹ thuật ISO-8601 là không tầm thường.
Dưới đây là ví dụ tham chiếu mà tôi không đảm bảo hoàn thành, mặc dù nó phân tích các ngày không kéo dài từ trang Wikipedia nói trên.
Dưới đây là ví dụ và bạn cũng có thể xem nó là output on ideone. Thật không may, nó không hoạt động với đặc điểm kỹ thuật vì nó không thực hiện đúng các tuần. Định nghĩa của tuần số 01 trong ISO-8601 là không tầm thường và yêu cầu một số duyệt lịch để xác định tuần bắt đầu và chính xác về số ngày trong năm được chỉ định. Điều này có thể khá dễ dàng sửa chữa (Tôi chỉ mệt mỏi khi chơi với nó).
function parseISODate (input) {
var iso = /^(\d{4})(?:-?W(\d+)(?:-?(\d+)D?)?|(?:-(\d+))?-(\d+))(?:[T ](\d+):(\d+)(?::(\d+)(?:\.(\d+))?)?)?(?:Z(-?\d*))?$/;
var parts = input.match(iso);
if (parts == null) {
throw new Error("Invalid Date");
}
var year = Number(parts[1]);
if (typeof parts[2] != "undefined") {
/* Convert weeks to days, months 0 */
var weeks = Number(parts[2]) - 1;
var days = Number(parts[3]);
if (typeof days == "undefined") {
days = 0;
}
days += weeks * 7;
var months = 0;
}
else {
if (typeof parts[4] != "undefined") {
var months = Number(parts[4]) - 1;
}
else {
/* it's an ordinal date... */
var months = 0;
}
var days = Number(parts[5]);
}
if (typeof parts[6] != "undefined" &&
typeof parts[7] != "undefined")
{
var hours = Number(parts[6]);
var minutes = Number(parts[7]);
if (typeof parts[8] != "undefined") {
var seconds = Number(parts[8]);
if (typeof parts[9] != "undefined") {
var fractional = Number(parts[9]);
var milliseconds = fractional/100;
}
else {
var milliseconds = 0
}
}
else {
var seconds = 0;
var milliseconds = 0;
}
}
else {
var hours = 0;
var minutes = 0;
var seconds = 0;
var fractional = 0;
var milliseconds = 0;
}
if (typeof parts[10] != "undefined") {
/* Timezone adjustment, offset the minutes appropriately */
var localzone = -(new Date().getTimezoneOffset());
var timezone = parts[10] * 60;
minutes = Number(minutes) + (timezone - localzone);
}
return new Date(year, months, days, hours, minutes, seconds, milliseconds);
}
print(parseISODate("2010-06-29T15:33:00Z-7"))
print(parseISODate("2010-06-29 06:14Z"))
print(parseISODate("2010-06-29T06:14Z"))
print(parseISODate("2010-06-29T06:14:30.2034Z"))
print(parseISODate("2010-W26-2"))
print(parseISODate("2010-180"))
Đây là một biểu hiện thường xuyên để kiểm tra theo tiêu chuẩn ISO 8601 định dạng ngày bao gồm cả năm nhuận và tháng ngắn ngủi kéo dài. Để chạy điều này, bạn sẽ cần phải "bỏ qua không gian trắng". Một phiên bản được nén gọn không có khoảng trắng nằm trên regexlib: http://regexlib.com/REDetails.aspx?regexp_id=3344
Có nhiều hơn với ISO 8601 - regex này chỉ quan tâm đến ngày, nhưng bạn có thể dễ dàng mở rộng nó để hỗ trợ xác thực thời gian.
Cập nhật: Đây hiện đang làm việc với javascript (không lookbehinds)
^(?:
(?=
[02468][048]00
|[13579][26]00
|[0-9][0-9]0[48]
|[0-9][0-9][2468][048]
|[0-9][0-9][13579][26]
)
\d{4}
(?:
(-|)
(?:
(?:
00[1-9]
|0[1-9][0-9]
|[1-2][0-9][0-9]
|3[0-5][0-9]
|36[0-6]
)
|
(?:01|03|05|07|08|10|12)
(?:
\1
(?:0[1-9]|[12][0-9]|3[01])
)?
|
(?:04|06|09|11)
(?:
\1
(?:0[1-9]|[12][0-9]|30)
)?
|
02
(?:
\1
(?:0[1-9]|[12][0-9])
)?
|
W(?:0[1-9]|[1-4][0-9]|5[0-3])
(?:
\1
[1-7]
)?
)
)?
)$
|
^(?:
(?!
[02468][048]00
|[13579][26]00
|[0-9][0-9]0[48]
|[0-9][0-9][2468][048]
|[0-9][0-9][13579][26]
)
\d{4}
(?:
(-|)
(?:
(?:
00[1-9]
|0[1-9][0-9]
|[1-2][0-9][0-9]
|3[0-5][0-9]
|36[0-5]
)
|
(?:01|03|05|07|08|10|12)
(?:
\2
(?:0[1-9]|[12][0-9]|3[01])
)?
|
(?:04|06|09|11)
(?:
\2
(?:0[1-9]|[12][0-9]|30)
)?
|
(?:02)
(?:
\2
(?:0[1-9]|1[0-9]|2[0-8])
)?
|
W(?:0[1-9]|[1-4][0-9]|5[0-3])
(?:
\2
[1-7]
)?
)
)?
)$
Để phục vụ cho thời gian, thêm một cái gì đó như thế này vào hỗn hợp (từ: http://underground.infovark.com/2008/07/22/iso-date-validation-regex/):
([T\s](([01]\d|2[0-3])((:?)[0-5]\d)?|24\:?00)?(\15([0-5]\d))?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?
tôi làm lại các câu trả lời hàng đầu vào một cái gì đó ngắn gọn hơn một chút. Thay vì viết ra mỗi một trong ba mẫu tùy chọn, các phần tử được lồng nhau như là các câu lệnh tùy chọn.
/[+-]?\d{4}(-[01]\d(-[0-3]\d(T[0-2]\d:[0-5]\d:?([0-5]\d(\.\d+)?)?[+-][0-2]\d:[0-5]\dZ?)?)?)?/
Tôi tò mò nếu có những nhược điểm của phương pháp này?
Bạn có thể tìm các bài kiểm tra cho câu trả lời đề nghị của tôi ở đây: http://regexr.com/3e0lh
Điều này sẽ không hoạt động với: 2016-09-05T15: 22: 26.286Z Đặt '[+ -] [0-2] \ d: [0-5] \ d' tùy chọn làm cho nó hoạt động: ' [+ -]? \ d {4} (- [01] \ d (- [0-3] \ d (T [0-2] \ d: [0-5] \ d:? ([0-5 ] \ d (\. \ d +)?)? ([+ -] [0-2] \ d: [0-5] \ d)? Z?)?)?)? ' – Frank
Đối phù hợp với chỉ ngày ISO, như 2017/09/22, bạn có thể sử dụng regexp này:
^\d{4}-([0]\d|1[0-2])-([0-2]\d|3[01])$
Nó sẽ phù hợp với bất kỳ số năm, bất kỳ tháng nào được chỉ định bởi hai chữ số trong khoảng 00-12 và bất kỳ ngày nào được chỉ định bởi hai chữ số trong khoảng 00-31
tôi sử dụng '/^(\ d {4}) - 0? (\ d +) - 0? (\ d +) [T] 0? (\ d +): 0? (\ d +): 0? (\ d +) $/', (tuy nhiên đó không phải là điều nghiêm ngặt nhất) .. chuyển đổi thành Ngày là khác nhau câu chuyện :) – mykhal