รูปแบบวันที่“ ถูกต้อง” ของ JSON


1137

ฉันเห็นมาตรฐานที่แตกต่างกันมากมายสำหรับรูปแบบวันที่ของ JSON:

"\"\\/Date(1335205592410)\\/\""         .NET JavaScriptSerializer
"\"\\/Date(1335205592410-0500)\\/\""    .NET DataContractJsonSerializer
"2012-04-23T18:25:43.511Z"              JavaScript built-in JSON object
"2012-04-21T18:25:43-05:00"             ISO 8601

อันไหนที่ถูกต้อง? หรือดีที่สุด มีมาตรฐานประเภทใดบ้างในเรื่องนี้?


75
ไม่มีรูปแบบวันที่ใน JSON มีเพียงสตริงที่ de- / serializer ตัดสินใจที่จะแมปกับค่าวันที่

11
strings, numbers, true, false, null, objectsและarrays
รัสบแคม

12
อย่างไรก็ตามจาวาสคริปต์ในตัววัตถุ JSONและISO8601มีข้อมูลทั้งหมดที่มนุษย์และคอมพิวเตอร์ต้องเข้าใจและไม่ต้องอาศัยจุดเริ่มต้นของยุคคอมพิวเตอร์ (1970-1-1)
poussma

คำตอบ:


1849

JSONเองไม่ได้ระบุวิธีการแสดงวันที่ แต่ JavaScript ทำ

คุณควรจะใช้รูปแบบที่ปล่อยออกมาโดยDate's toJSONวิธีการ:

2012-04-23T18:25:43.511Z

นี่คือเหตุผล:

  1. มันเป็นคนอ่านได้ แต่ยังรวบรัด

  2. มันจัดเรียงอย่างถูกต้อง

  3. มันมีเศษเสี้ยววินาทีซึ่งสามารถช่วยสร้างเหตุการณ์ขึ้นใหม่

  4. มันสอดคล้องกับISO 8601

  5. ISO 8601 ได้รับการยอมรับอย่างดีในระดับสากลมานานกว่าทศวรรษ

  6. ISO 8601 รับรองโดยW3C , RFC3339และXKCD

ที่ถูกกล่าวว่าห้องสมุดทุกวันที่เคยเขียนสามารถเข้าใจ "มิลลิวินาทีตั้งแต่ปี 1970" ดังนั้นเพื่อความสะดวกในการพกพาThiefMasterจึงถูกต้อง


32
นอกจากนี้ยังเป็นตัวแทนที่ต้องการตามECMA :JSON.stringify({'now': new Date()}) "{"now":"2013-10-21T13:28:06.419Z"}"
สตีเวน

11
ฉันจะเพิ่มอีกเหตุผลสำคัญในรายการ: มันเป็นสถานที่ที่เป็นอิสระ หากคุณมีวันที่ 02-03-2557 คุณต้องการข้อมูลเพิ่มเติมเพื่อทราบว่ามันหมายถึงวันที่ 3 กุมภาพันธ์หรือวันที่ 2 มีนาคม ขึ้นอยู่กับว่าใช้รูปแบบ US หรือรูปแบบอื่น
Juanal

107
upvote สำหรับการกล่าวถึงและการเชื่อมโยง xkcd: D @ Majorquera ฉันมักจะใช้ช่วงเวลานี้ ฉันเคยเห็นปัญหาเกี่ยวกับ IE ในเรื่องนี้
fholzer

54
เกี่ยวกับจุดที่สองมันไม่เรียงลำดับอย่างถูกต้องหลังจากปี 10000 เรามีเวลาเกือบ 8000 ปีในการสร้างรูปแบบใหม่ดังนั้นจึงอาจไม่ใช่ปัญหา
Erfa

7
ที่จริงแล้ว @Erfa ตั้งแต่-ก่อนที่ตัวเลขASCIIจะเรียงลำดับได้จนถึงปี 100,000 ; P
Ben Leggiero

128

JSON ไม่ทราบอะไรเกี่ยวกับวันที่ สิ่งที่. NET ทำคือแฮ็ค / ส่วนขยายที่ไม่ได้มาตรฐาน

ฉันจะใช้รูปแบบที่สามารถแปลงเป็นDateวัตถุใน JavaScript ได้อย่างง่ายดายเช่นรูปแบบที่สามารถส่งผ่านไปnew Date(...)ได้ รูปแบบที่ง่ายและพกพาได้มากที่สุดคือเวลาประทับที่มีมิลลิวินาทีตั้งแต่ปี 1970


3
stackoverflow.com/questions/10286385/… - มาดูกันว่ามีใครรู้ไหมว่าทำไม FF ถึงมีพฤติกรรมเช่นนั้น
ThiefMaster

11
หากคุณไปเส้นทางนี้ตรวจสอบให้แน่ใจว่าคุณไม่จำเป็นต้องจัดการกับวันที่เร็วกว่า 1970!
Ben Dolman

8
ดังที่ @BenDolman กล่าวว่า "การแก้ปัญหา" นี้ไม่เหมาะสมกับวันที่ก่อนวันที่ 1 มกราคม 1970 (ยุค) นอกจากนี้ยังมีเหตุผล ISO8601 อยู่ในสถานที่แรก บนโลกเรามีสิ่งที่เรียกว่า "เขตเวลา" ในหน่วยมิลลิวินาทีอยู่ที่ไหน JSON อาจไม่ได้มาตรฐานสำหรับวัน แต่วันที่อยู่ด้านนอกของ JSON และมีเป็นมาตรฐานสำหรับการที่ คำตอบของ funroll เป็นคำตอบที่ถูกต้อง (ดูเพิ่มเติมที่: xkcd.com/1179 )
JoeLinux

5
มันอาจจะยังมีมูลค่าการกล่าวขวัญว่า (หนึ่งในพัน) วินาทีจากปี 1970 ไม่สามารถคาดเดาสำหรับวันที่ในอนาคตเพราะเรามีวินาทีก้าวกระโดด ดังนั้นฉันจะไม่ใช้ถ้าสำหรับการสื่อสารระหว่างกระบวนการและการจัดเก็บข้อมูล อย่างไรก็ตามมันดีที่จะใช้ภายในในโปรแกรมเนื่องจากสามารถเก็บไว้ในจำนวนเต็มเดียวซึ่งให้ประโยชน์ด้านประสิทธิภาพบางประการแก่คุณ
Brodie Garnet

5
Unix timestamp เป็น UTC เสมอคุณแปลงจากเขตเวลาท้องถิ่นของคุณก่อนที่จะสร้างการประทับเวลาและกลับไปที่เขตเวลาท้องถิ่นบนจอแสดงผลอีกครั้งไม่มีความกำกวมอยู่ที่นั่น
lkraider

46

ไม่มีรูปแบบที่เหมาะสมคือ ; ข้อกำหนด JSONไม่ได้ระบุรูปแบบสำหรับการแลกเปลี่ยนวันซึ่งเป็นเหตุผลที่มีวิธีการที่แตกต่างกันมากมายที่จะทำมัน

รูปแบบที่ดีที่สุดคือวันที่ที่แสดงในรูปแบบ ISO 8601 ( ดู Wikipedia ) มันเป็นรูปแบบที่รู้จักกันดีและใช้กันอย่างแพร่หลายและสามารถจัดการได้ในหลายภาษาที่แตกต่างกันทำให้เหมาะมากสำหรับการทำงานร่วมกัน หากคุณมีการควบคุม json ที่สร้างขึ้นคุณให้ข้อมูลกับระบบอื่นในรูปแบบ json โดยเลือก 8601 เนื่องจากรูปแบบการแลกเปลี่ยนวันที่เป็นตัวเลือกที่ดี

หากคุณไม่สามารถควบคุม json ที่สร้างขึ้นได้ตัวอย่างเช่นคุณเป็นผู้บริโภคของ json จากระบบที่มีอยู่หลายระบบวิธีที่ดีที่สุดในการจัดการนี้คือให้มียูทิลิตี้การแยกวิเคราะห์วันที่เพื่อจัดการกับรูปแบบที่แตกต่างกัน


2
@mlissner แต่นั่นเป็นความเห็นที่ดีที่สุด ISO-8601 เป็นมาตรฐาน แต่ก็ไม่ใช่มาตรฐานสำหรับ JSON (แม้ว่าฉันจะใช้มัน) ตัวอย่างเช่น Microsoft ตัดสินใจที่จะไม่ใช้ ( msdn.microsoft.com/en-us/library/… ) แนวทางปฏิบัติที่ดีที่สุดคือการปฏิบัติตามอนุสัญญาหนึ่งอย่าง ดังที่ฉันได้กล่าวไว้ในคำตอบวิธีที่ดีที่สุดในการจัดการสิ่งนี้คือการกำหนดฟังก์ชั่นยูทิลิตี้การแยกวิเคราะห์วันที่ที่สามารถรองรับรูปแบบที่คาดหวัง หากคุณรวมกับระบบที่ใช้รูปแบบที่แตกต่างกันฟังก์ชั่นควรจัดการแต่ละกรณี
Russ Cam

1
@RussCam เราสามารถกลับไปกลับมา แต่ถ้ามีคนถามวิธีที่ดีที่สุดในการเข้ารหัสวันที่ใน JSON พวกเขาจะถามวิธีจัดรูปแบบวันที่เมื่อพวกเขาสร้าง JSON (และคำตอบโดยทั่วไปคือ ISO-8601) คุณกำลังตอบคำถามตรงข้าม: วิธีการใช้วันที่ JSON เมื่อพวกเขาทำแล้ว (แม้ว่าคำแนะนำของคุณจะดัง)
mlissner

1
ข้อกำหนดคุณสมบัติสกีมา JSON บอกว่าวันที่ที่ตรวจสอบโดยสคีมาจะต้องอยู่ในรูปแบบ 8601
gnasher729

3
@ gnasher729 คุณมีลิงก์หรือไม่
Russ Cam

@vallismortis - นั่นคือร่างข้อกำหนดสำหรับการกำหนด schema สำหรับโครงสร้าง json ที่กำหนดแลกเปลี่ยนระหว่างปาร์ตี้ไม่ใช่รูปแบบสำหรับวันที่ในข้อมูลจำเพาะของ json ฉันจะแก้ไขคำตอบของฉันตามความคิดเห็นมันไม่ปรากฏว่าฉันทำให้ชัดเจนเพียงพอ
Russ Cam

27

จากRFC 7493 (รูปแบบข้อความ I-JSON) :

I-JSON ย่อมาจาก Internet JSON หรือ Interoperable JSON ขึ้นอยู่กับว่าคุณถามใคร

โปรโตคอลมักจะมีรายการข้อมูลที่ออกแบบมาให้มีการประทับเวลาหรือระยะเวลา ขอแนะนำว่ารายการข้อมูลดังกล่าวทั้งหมดจะแสดงเป็นค่าสตริงในรูปแบบ ISO 8601 ตามที่ระบุในRFC 3339พร้อมกับข้อ จำกัด เพิ่มเติมที่ใช้ตัวพิมพ์ใหญ่แทนตัวอักษรตัวพิมพ์เล็กซึ่งไม่รวมค่าเริ่มต้นและไม่กี่วินาทีในการติดตาม ถูกรวมแม้ว่าค่าของพวกเขาคือ "00" นอกจากนี้ขอแนะนำว่ารายการข้อมูลทั้งหมดที่มีช่วงเวลาเป็นไปตามการผลิต "ระยะเวลา" ในภาคผนวก A ของ RFC 3339 ที่มีข้อ จำกัด เพิ่มเติมเช่นเดียวกัน


2
นี่เป็นรูปแบบที่สร้างขึ้นโดยDate().toISOString()และDate().toJSON()ด้วยข้อ จำกัด ที่Dateไม่ได้ติดตามค่าเขตเวลาและด้วยเหตุนี้จึงส่งการประทับเวลาในเขตเวลา UTC ( Z) เสมอ ค่าที่สามารถแยกวิเคราะห์โดยใช้และnew Date("...") Date.parseDate
SørenLøvborg

15

เพียงเพื่อการอ้างอิงฉันเคยเห็นรูปแบบนี้ใช้:

Date.UTC(2017,2,22)

มันทำงานร่วมกับJSONPซึ่งได้รับการสนับสนุนจาก$.getJSON()ฟังก์ชั่น ไม่แน่ใจว่าฉันจะไปไกลแค่ไหนเพื่อแนะนำวิธีนี้ ... แค่ทิ้งมันไปเพราะความเป็นไปได้เพราะคนทำแบบนี้

FWIW:ไม่เคยใช้วินาทีเนื่องจากยุคในโปรโตคอลการสื่อสารหรือมิลลิวินาทีนับตั้งแต่ยุคเนื่องจากสิ่งเหล่านี้เต็มไปด้วยอันตรายเนื่องจากการใช้งานแบบสุ่มของวินาทีกระโดดแบบสุ่ม

เป็นสัตว์เลี้ยงที่เกลียดชัง แต่หลายคนเชื่อว่า UTC เป็นเพียงชื่อใหม่สำหรับ GMT - ผิด! หากระบบของคุณไม่ได้ใช้วินาทีกระโดดคุณก็ใช้ GMT (มักเรียกว่า UTC แม้จะไม่ถูกต้อง) หากคุณใช้วินาทีกระโดดอย่างเต็มที่คุณกำลังใช้ UTC จริง ๆ วินาทีกระโดดในอนาคตไม่สามารถรู้ได้ พวกเขาได้รับการเผยแพร่โดย IERS ตามความจำเป็นและต้องการการปรับปรุงอย่างต่อเนื่อง หากคุณกำลังใช้ระบบที่พยายามใช้วินาทีกระโดด แต่มีและตารางอ้างอิงที่ล้าสมัย (มากกว่าที่คุณคิด) จากนั้นคุณไม่มี GMT หรือ UTC คุณมีระบบ wonky ที่อ้างว่าเป็น UTC

ตัวนับวันที่เหล่านี้เข้ากันได้ก็ต่อเมื่อแสดงในรูปแบบที่แยกย่อย (y, m, d, ฯลฯ ) พวกเขาไม่เคยเข้ากันได้ในรูปแบบยุค เก็บไว้ในใจ


4
ฉันจะไม่ใช้รูปแบบนั้น แต่ข้อมูลที่คุณให้ไว้มีประโยชน์มากขอบคุณ!
Robert Mikes

9

หากมีข้อสงสัยให้ไปที่คอนโซลเว็บ javascript ของเบราว์เซอร์สมัยใหม่โดยกด F12 (Ctrl + K ใน Firefox) และเขียนสิ่งต่อไปนี้:

new Date().toISOString()

จะส่งออก:

"2019-07-04T13: 33: 03.969Z"

Ta-da !!


3

ฉันเชื่อว่ารูปแบบที่ดีที่สุดสำหรับการใช้งานร่วมกันสากลไม่ใช่สตริง ISO-8601 แต่เป็นรูปแบบที่ใช้โดย EJSON:

{ "myDateField": { "$date" : <ms-since-epoch> } }

ตามที่อธิบายไว้ที่นี่: https://docs.meteor.com/api/ejson.html

ประโยชน์ที่ได้รับ

  1. การแยกวิเคราะห์ประสิทธิภาพ:หากคุณเก็บวันที่เป็นสตริง ISO-8601 นี่เป็นสิ่งที่ดีถ้าคุณคาดหวังค่าวันที่ภายใต้ฟิลด์นั้น แต่ถ้าคุณมีระบบที่ต้องกำหนดประเภทค่าโดยไม่มีบริบทคุณจะวิเคราะห์ทุกสตริงสำหรับ รูปแบบวันที่.
  2. ไม่ต้องการการตรวจสอบความถูกต้องวันที่:คุณไม่จำเป็นต้องกังวลเกี่ยวกับการตรวจสอบความถูกต้องและการตรวจสอบความถูกต้องของวันที่ แม้ว่าสตริงจะตรงกับรูปแบบ ISO-8601 ก็อาจไม่ใช่วันที่จริง สิ่งนี้ไม่สามารถเกิดขึ้นได้กับวันที่ EJSON
  3. การประกาศประเภทที่ไม่คลุมเครือ:ตราบใดที่ระบบข้อมูลทั่วไปดำเนินไปหากคุณต้องการจัดเก็บสตริง ISO เป็นสตริงในกรณีหนึ่งและวันที่ระบบจริงในอีกกรณีหนึ่งระบบทั่วไปที่ใช้รูปแบบสตริง ISO-8601 จะไม่อนุญาตสิ่งนี้ (โดยไม่มีเทคนิคการหลบหนีหรือวิธีแก้ปัญหาที่น่ากลัวที่คล้ายกัน)

ข้อสรุป

ฉันเข้าใจว่ารูปแบบที่มนุษย์อ่านได้ (สตริง ISO-8601) มีประโยชน์และสะดวกมากขึ้นสำหรับกรณีการใช้ 80% และแน่นอนว่าไม่มีใครควรบอกให้ไม่เก็บวันที่ของพวกเขาเป็นสตริง ISO-8601 ถ้านั่นคือสิ่งที่แอปพลิเคชันของพวกเขา เข้าใจแต่สำหรับรูปแบบการขนส่งที่เป็นที่ยอมรับในระดับสากลซึ่งควรรับประกันค่าบางอย่างเพื่อให้แน่นอนว่าเป็นวันที่เราจะอนุญาตให้มีความคลุมเครือและจำเป็นต้องมีการตรวจสอบมาก?


ดูคำตอบนี้ในหัวข้อก่อนหน้าเพราะเหตุใดมิลลิวินาทีเนื่องจากยุคมีคำเตือนเช่นการคำนวณการกระโดดที่ไม่ถูกต้อง ฯลฯ : stackoverflow.com/a/42480073/190476
Sudhanshu Mishra

@SudhanshuMishra คำเตือนที่คุณอ้างอิงเป็น gotchas ทั่วไปสำหรับความกังวลทางวิชาการอย่างมากของการประทับเวลายูนิกซ์ส่วนใหญ่เกี่ยวข้องกับการสร้างการประทับเวลา นี่เป็นความกังวลที่น้อยลงด้วยการแก้ไขมิลลิวินาที ตามที่ถูกเรียกออกมาในความคิดเห็นอื่นวันที่ของคอมพิวเตอร์ส่วนใหญ่จะแสดงภายในเป็นเวลาประทับ unix แม้ว่าจะถูกเปิดเผยและจัดรูปแบบเป็นอย่างอื่นก็ตาม อย่างไรก็ตามมีอะไรผิดปกติกับการแสดงมิลลิวินาทีของวันที่ + เวลาใด ๆ โดยเฉพาะอย่างยิ่งเมื่อเปรียบเทียบกับวิธีการอื่น ๆ ซึ่งสามารถได้รับผลกระทบอย่างง่ายจาก caveats นาโนผลกระทบเดียวกันภายใต้ฝากระโปรง
Ciabaros

เพียงแค่เพิ่มเกี่ยวกับความกังวลของวันที่ "นอกช่วง" สำหรับ unix timestamps: สิ่งเหล่านี้เป็นปัญหาการจัดเก็บข้อมูลของระบบที่จะได้รับการแก้ไขในบริบทที่กว้างกว่ารูปแบบการขนส่ง ตัวอย่างเช่นรูปแบบนี้ไม่จำเป็นต้องถูก จำกัด จำนวนเต็มที่พอดีกับ 32 บิตและไม่จำเป็นต้องเป็นจำนวนบวกอย่างเคร่งครัด แต่ไม่มีใครจะแก้ปัญหา "ปัญหาปี 2038" โดยวาง timestamps ในระดับระบบ / สถาปัตยกรรม ; พวกเขาเพียงแค่ต้องขยาย (เช่น 64- บิตหรือมากกว่า) และสิ่งนี้จะไม่ส่งผลกระทบต่อรูปแบบการขนส่งที่เสนอนี้
Ciabaros

3

JSON ตัวเองมีรูปแบบวันที่ไม่มีก็ไม่สนใจว่าจะมีใครวันที่ร้านค้า อย่างไรก็ตามเนื่องจากคำถามนี้ถูกติดแท็กด้วย javascript ฉันคิดว่าคุณต้องการทราบวิธีจัดเก็บวันที่ของ javascript ใน JSON คุณสามารถส่งผ่านวันที่ไปยังJSON.stringifyเมธอดและมันจะใช้Date.prototype.toJSONตามค่าเริ่มต้นซึ่งจะใช้ในทางกลับกันDate.prototype.toISOString( MDN ในวันที่ to.JSON ):

const json = JSON.stringify(new Date());
const parsed = JSON.parse(json); //2015-10-26T07:46:36.611Z
const date = new Date(parsed); // Back to date object

ฉันยังพบว่ามีประโยชน์ในการใช้reviverพารามิเตอร์ของJSON.parse( MDN บน JSON.parse ) เพื่อแปลงสตริง ISO กลับไปเป็นวันที่จาวาสคริปต์โดยอัตโนมัติเมื่อฉันอ่านสตริง JSON

const isoDatePattern = new RegExp(/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/);

const obj = {
 a: 'foo',
 b: new Date(1500000000000) // Fri Jul 14 2017, etc...
}
const json = JSON.stringify(obj);

// Convert back, use reviver function:
const parsed = JSON.parse(json, (key, value) => {
    if (typeof value === 'string' &&  value.match(isoDatePattern)){
        return new Date(value); // isostring, so cast to js date
    }
    return value; // leave any other value as-is
});
console.log(parsed.b); // // Fri Jul 14 2017, etc...

2

วิธีที่ต้องการใช้2018-04-23T18:25:43.511Z...

ภาพด้านล่างแสดงสาเหตุที่เป็นวิธีที่ต้องการ:

วันที่ JSON

ดังนั้นตามที่คุณเห็น Date มีวิธีเนทีtoJSONฟซึ่งreturnในรูปแบบนี้และสามารถแปลงเป็นDateอีกครั้งได้อย่างง่ายดาย...


2
แก้ไข! ไวยากรณ์การแลกเปลี่ยนข้อมูล JSON ไม่ได้ระบุมาตรฐาน: ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdfแต่ในทางปฏิบัติรูปแบบที่เข้ากันได้กับ ISO 8601 นั้นเป็นที่ต้องการมากขึ้นในทุกแพลตฟอร์มรวมถึงจาวาสคริปต์รันไทม์
Kamyar Nazeri

1

ใน Sharepoint 2013 การรับข้อมูลใน JSON ไม่มีรูปแบบการแปลงวันที่เป็นรูปแบบวันที่เท่านั้นเนื่องจากในวันนั้นควรอยู่ในรูปแบบ ISO

yourDate.substring(0,10)

สิ่งนี้อาจเป็นประโยชน์สำหรับคุณ


0

"2014-01-01T23: 28: 56.782Z"

วันที่จะแสดงในรูปแบบมาตรฐานและเรียงลำดับได้ซึ่งแสดงเวลา UTC (ระบุโดย Z) ISO 8601 ยังสนับสนุนเขตเวลาด้วยการแทนที่ Z ด้วย + หรือ - ค่าสำหรับการชดเชยเขตเวลา:

"2014-02-01T09: 28: 56.321-10: 00"

มีการเข้ารหัสเขตเวลาอื่น ๆ ในข้อมูลจำเพาะ ISO 8601 แต่รูปแบบ –10: 00 เป็นรูปแบบ TZ เพียงรูปแบบเดียวที่ตัวแยกวิเคราะห์ JSON ปัจจุบันสนับสนุน โดยทั่วไปควรใช้รูปแบบ UTC (Z) เว้นแต่ว่าคุณมีความต้องการเฉพาะในการหาเขตเวลาที่ผลิตวันที่ (เป็นไปได้เฉพาะในการสร้างฝั่งเซิร์ฟเวอร์)

NB: var date = new Date (); console.log วันที่ (); // พุธ ม.ค. 01 2014 13:28:56 GMT- 1,000 (เวลามาตรฐานฮาวาย)

var json = JSON.stringify(date);
console.log(json);  // "2014-01-01T23:28:56.782Z"

เพื่อบอกคุณว่าเป็นวิธีที่ต้องการแม้ว่า JavaScript จะไม่มีรูปแบบมาตรฐาน

// JSON encoded date
var json = "\"2014-01-01T23:28:56.782Z\"";

var dateStr = JSON.parse(json);  
console.log(dateStr); // 2014-01-01T23:28:56.782Z

0

หากคุณใช้ Kotlin นี่จะช่วยแก้ปัญหาของคุณ (รูปแบบ MS Json)

val dataString = "/Date(1586583441106)/"
val date = Date(Long.parseLong(dataString.substring(6, dataString.length - 2)))

-3

มันใช้งานได้สำหรับฉันกับ parse Server

{
    "ContractID": "203-17-DC0101-00003-10011",
    "Supplier":"Sample Co., Ltd",
    "Value":12345.80,
    "Curency":"USD",
    "StartDate": {
                "__type": "Date",
                "iso": "2017-08-22T06:11:00.000Z"
            }
}

-6

มีคำตอบที่ถูกต้องเพียงข้อเดียวเท่านั้นและระบบส่วนใหญ่ผิดพลาด จำนวนมิลลิวินาทีนับตั้งแต่ยุคหรือเลขจำนวนเต็ม 64 บิต เขตเวลาเป็นข้อกังวลใจของ UI และไม่มีธุรกิจในเลเยอร์แอพหรือเลเยอร์ db เหตุใด db ของคุณจึงสนใจเขตเวลาคือเมื่อคุณรู้ว่ามันจะเก็บเป็นจำนวนเต็ม 64 บิตจากนั้นทำการคำนวณการแปลง

ตัดส่วนที่ไม่เกี่ยวข้องออกไปและทำวันที่ให้เป็นตัวเลขจนถึง UI คุณสามารถใช้ตัวดำเนินการทางคณิตศาสตร์อย่างง่ายในการทำแบบสอบถามและตรรกะ


ความคิดเห็นที่ได้รับการย้ายไปแชท
Jon Clements

5
ตอนนี้คุณมี 2 ปัญหา: ยุคไหนที่คุณควรเลือกและควรนับเป็นมิลลิวินาทีใด อาจเป็นตัวเลือกที่พบบ่อยที่สุดคือเวลา Unix (1970-01-01T00: 00: 00 UTC และ SI มิลลิวินาทียกเว้นตัวที่อยู่ในการก้าวกระโดดครั้งที่สอง) แต่แน่นอนว่าจะทำให้เวลาในอนาคตไม่ได้กำหนดไว้
aij

2
ดังนั้นคุณจะแทนไมโครวินาทีได้อย่างไร RFC3339 ทำงานได้ดีกับความแม่นยำใด ๆ คุณจะมีเครื่องอ่านที่แยกวิเคราะห์เขตเวลาและให้เวลาที่ถูกต้องแก่คุณและเป็นข้อมูลเพิ่มเติม แอปปฏิทินมักจะสนใจเกี่ยวกับเขตเวลา
gnasher729

11
เขตเวลาไม่ใช่ข้อกังวลใจของ UI เว้นแต่คุณจะไม่พลาดเที่ยวบินถัดไปของคุณ เที่ยวบินจะโพสต์ในเวลาท้องถิ่นและปฏิบัติตามกฎเฉพาะสำหรับการเปลี่ยนแปลงเวลา การสูญเสียออฟเซ็ตหมายถึงการสูญเสียข้อมูลทางธุรกิจที่สำคัญ
Panagiotis Kanavos

1
โต้เถียงเพิ่มเติมบางอย่างรวมถึงความสามารถในการเป็นตัวแทนของเวลาก่อนปี 1970 (สมมติว่ายุคสมัยนั้น) และแนวโน้มของ JSON จะค่อนข้างมนุษย์สามารถอ่านได้
Timo

-8

รหัสต่อไปนี้ได้ผลสำหรับฉัน รหัสนี้จะพิมพ์วันที่ในรูปแบบDD-MM-YYYY

DateValue=DateValue.substring(6,8)+"-"+DateValue.substring(4,6)+"-"+DateValue.substring(0,4);

มิฉะนั้นคุณสามารถใช้:

DateValue=DateValue.substring(0,4)+"-"+DateValue.substring(4,6)+"-"+DateValue.substring(6,8);

-19

ฉันคิดว่ามันขึ้นอยู่กับกรณีการใช้งาน ในหลายกรณีการใช้โมเดลวัตถุที่เหมาะสมอาจเป็นประโยชน์มากกว่า (แทนที่จะแสดงวันที่เป็นสตริง) เช่น:

{
"person" :
      {
 "name" : {
   "first": "Tom",
   "middle": "M",
  ...
}
 "dob" :  {
         "year": 2012,
         "month": 4,
         "day": 23,
         "hour": 18,
         "minute": 25,
         "second": 43,
         "timeZone": "America/New_York"
    }   
   }
}

เป็นที่ยอมรับว่านี่เป็น verbose มากกว่า RFC 3339 แต่:

  • มันเป็นมนุษย์อ่านได้เช่นกัน
  • มันใช้โมเดลวัตถุที่เหมาะสม (ใน OOP เท่าที่ JSON อนุญาต)
  • มันสนับสนุนโซนเวลา (ไม่ใช่แค่ UTC offset ในวันและเวลาที่กำหนด)
  • มันสามารถรองรับหน่วยที่เล็กกว่าเช่นมิลลิวินาทีนาโนวินาที ... หรือเพียงเสี้ยววินาที
  • ไม่ต้องใช้ขั้นตอนการแยกวิเคราะห์แยกต่างหาก (เพื่อแยกสตริงวันที่และเวลา) ตัวแยกวิเคราะห์ JSON จะทำทุกอย่างให้คุณ
  • สร้างง่ายด้วยกรอบเวลาวันที่หรือการใช้งานในภาษาใด ๆ
  • สามารถขยายได้อย่างง่ายดายเพื่อรองรับเครื่องชั่งปฏิทินอื่น ๆ (ฮิบรู, จีน, อิสลาม ... ) และยุค (AD, BC, ... )
  • ปีนี้ปลอดภัย 10,000 ;-) (ไม่ใช่ RFC 3339)
  • รองรับวันที่และเวลาลอยตัวทั้งวัน (Javascript Date.toJSON()ไม่รองรับ)

ฉันไม่คิดว่าการเรียงลำดับที่ถูกต้อง (ตามที่ระบุไว้โดย funroll สำหรับ RFC 3339) เป็นคุณลักษณะที่จำเป็นจริงๆเมื่อทำการเรียงลำดับวันที่เป็น JSON นอกจากนี้ยังเป็นเรื่องจริงสำหรับวันที่ที่มีการชดเชยเวลาในเขตเวลาเดียวกัน


7
ฉันสงสัยว่าทุกคนจะใช้ json ในปี 10,000 หรือแม้กระทั่งในเวลานั้นปีที่ 10,000 จะยังคงเป็นปีที่ 10,000 แต่ถ้าทั้งสองสิ่งนั้นยังคงเป็นจริงในตอนนั้นรูปแบบสามารถขยายได้เพียง 3 หลัก องค์ประกอบศตวรรษ ดังนั้นฉันจะบอกว่าผู้คนสามารถติดกับ RFC 3339 อย่างน้อยก็จนกว่าปี 9900
ความทรงจำของความฝัน

8
@downvoters: ทำไมการลงคะแนนจึงสำคัญ? คุณควร downvote post contains wrong information, is poorly researched, or fails to communicate informationถ้า โปรดอธิบายด้วยเหตุผลข้อใดข้อหนึ่งที่คุณได้ลบคะแนนคำตอบนี้
Marten

5
@ Martin สองสิ่ง 1. คุณไม่เคยเป็นหนี้คำอธิบายของ downvotes แต่ฉันเข้าใจว่ามันมีประโยชน์ 2. ฉันไม่ได้ลงคะแนนคำตอบของคุณ แต่ฉันเดาว่าคนอื่นไม่ชอบคำตอบของคุณเพราะพวกเขาคิดว่ามันผิดวิธีในการทำเช่นนี้ ที่จะมีสิทธิ์ได้ว่ามันเป็น "ข้อมูลผิด" ตั้งแต่คำถามที่กำลังมองหาวิธีที่ดีที่สุดที่จะทำบางสิ่งบางอย่าง
เควินเวลส์

7
ฉันไม่ได้ลงคะแนนคุณ แต่ฉันสามารถเข้าใจได้อย่างชัดเจนว่า "คิดค้นรูปแบบอื่นที่ระบุไม่ดี" (ซึ่งโดยทั่วไปคือสิ่งที่คุณพูด) จะถูกมองว่าผิดหรือวิจัยไม่ดี
aij

2
@Phil, UTC ไม่ได้จริงๆโซนเวลา (ไม่มีสถานที่บนโลกที่ใช้ "UTC" เป็นโซนเวลาอย่างเป็นทางการ) มันเป็นเวลามาตรฐาน นอกจากนี้การชดเชยโซนเวลายังไม่แน่นอน ไม่มีทางที่จะบอกว่าถ้าใน 2025 "เวลา 00:00 มอสโก" ยังคงเป็น "09:00 UTC" เหมือนว่ามันจะเป็นวันนี้จะได้รับการไม่มีการเปลี่ยนแปลงสองสามครั้งในช่วง 30 ปีที่ผ่านมา หากคุณต้องการแสดงเวลาท้องถิ่นในอนาคตคุณต้องมีเขตเวลาจริง
Marten
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.