محلل تاريخ/وقت اللغة الطبيعية لـ .NET؟[مغلق]

StackOverflow https://stackoverflow.com/questions/23689

  •  09-06-2019
  •  | 
  •  

سؤال

هل يعرف أحد محللًا للتاريخ/الوقت في .NET مشابهًا لـ مزمن لروبي (يتعامل مع أشياء مثل "غدًا" أو "3 مساءً يوم الخميس القادم")؟

ملحوظة:أنا أكتب روبي (وهذا هو ما أعرفه عن Chronic) ولكن هذا المشروع يجب أن يستخدم .NET.

هل كانت مفيدة؟

المحلول

لقد قمنا بتطوير ما تبحث عنه بالضبط في مشروع داخلي.نحن نفكر في نشر هذا الأمر إذا كانت هناك حاجة كافية لذلك.قم بإلقاء نظرة على هذه المدونة لمزيد من التفاصيل: http://precisionsoftwaredesign.com/blog.php.

لا تتردد في الاتصال بي إذا كنت مهتما:contact@precisionsoftware.us

هذه المكتبة هي الآن مشروع SourceForge.الصفحة موجودة في:

http://www.SourceForge.net/p/naturaldate

التجميع موجود في قسم التنزيلات، والمصدر متاح مع Mercurial.

نصائح أخرى

لا أعرف، ولكن هناك منفذ جافا يسمى com.jchronic.إذا لم يكن هناك شيء آخر، فإنه يمكن أن يوفر نقطة انطلاق جيدة لنفسك.أو ربما يمكنك استخدام مترجم Java شبه تلقائي إلى C# مثل أخطبوط للمساعدة في ترجمتها.(أو خير إذا كان أحد يعلم شيئا).

حسنًا، طريق آخر محتمل:هل يمكنك استخدام الكود المزمن باستخدام أيرون روبي?

يوجد منفذ .NET لـ Chronic.يرى https://github.com/robertwilczynski/nChronic.لقد قمت بإنشاء شوكة منه مع بعض التحسينات وإصلاحات الأخطاء، هنا: https://github.com/dorony/nChronic (تم إرسال طلبات السحب، ولم يستجب المؤلف بعد).

@ بلير كونراد - أفكار جيدة!لقد حاولت تشغيل Chronic ضمن برنامج IronRuby ولكن واجهت بعض المشاكل مع التبعيات - لا أعلم أنه جاهز بعد.

لقد وجدت مشروعا على كودبلكس (DateTimeEnglishParser) الذي يحاول أن يفعل الشيء نفسه.إنها لا تتعامل مع السنوات أو الوقت بعد، لكنها بداية جيدة.لقد عملت في المشروع قليلاً وساهمت في تصحيح للتعامل بشكل أفضل مع الأرقام المكتوبة.

إنها مشكلة مثيرة للاهتمام، وقد ساعدتني بالتأكيد على فهم التعبيرات العادية بشكل أفضل، لذلك أعتقد أنني سأستمر في العمل عليها.

كان هناك موضوع مماثل في وقت سابق وأعطت رابطًا لمكتبة على CodeProject يبدو أنها تفعل ما تريد: http://www.codeproject.com/KB/edit/dateparser.aspx ولكن لسوء الحظ يبدو أن المكتبة مكتوبة بـ MFC لذا يتعين عليك إنشاء ملف DLL منها ثم الاتصال بها من برنامج .NET الخاص بك.

بالمسي، لقد تلقيت مؤخرًا نفس المطلب لذا تقدمت وكتبت محللًا بسيطًا.إنه ليس الكود الأجمل ولكنه سيتعامل مع أشياء مثل:

"اليوم في الساعة 2 مساءً" "يوم الثلاثاء في الساعة 2 مساءً - 15 يوليو 2010 في الساعة 2 صباحًا" "العام السابق في الساعة 2 صباحًا - Tommorow في 14:30" "18 يوليو 2010 في 2:45 مساءً"

علقها على codeplex ربما يجدها شخص آخر مفيدًا.تحقق من ذلك: http://timestamper.codeplex.com/

لقد قمت بفحص العديد من الأطر وPython ParseDateTime عملت الأفضل.ويمكن استخدامه من .NET باستخدام IronPython.

إذا كان أي شخص مهتمًا بنموذج مشروع كامل، قم بالتعليق على الإجابة وسأحاول إنشاء واحد.

يحرر

كما هو مطلوب، إليك مشروع بسيط يمكنك استخدامه مع المكتبة:

http://www.assembla.com/code/relativedateparser/subversion/nodes

جرب حالة الاستخدام التالية، على سبيل المثال:

  • 25 أغسطس 2008
  • 25 أغسطس 2008
  • 25 أغسطس 5 مساءً
  • الساعة الخامسة مساء 25 أغسطس
  • السبت المقبل
  • غداً
  • يوم الخميس القادم الساعة 4 مساءا
  • في 16:00
  • التخلص من الذخائر المتفجرة
  • التخلص من الذخائر المتفجرة غدا
  • التخلص من الذخائر المتفجرة الثلاثاء
  • eoy
  • eom
  • في 5 دقائق
  • 5 دقائق من الآن
  • قبل 5 ساعات من الآن
  • 2 ساعة قبل الظهر
  • يومين من الغد

لست على علم بواحدة منها، لكنها بدت وكأنها مشكلة رائعة، لذا فإليك الحل الأمثل لها (VB.NET):

Private Function ConvertDateTimeToStringRelativeToNow(ByVal d As DateTime) As String
    Dim diff As TimeSpan = DateTime.Now().Subtract(d)
    If diff.Duration.TotalMinutes < 1 Then Return "Now"

    Dim str As String
    If diff.Duration.TotalDays > 365 Then
        str = CInt(diff.Duration.TotalDays / 365).ToString() & " years"
    ElseIf diff.Duration.TotalDays > 30 Then
        str = CInt(diff.TotalDays / 30).ToString() & " months"
    ElseIf diff.Duration.TotalHours > 24 Then
        str = CInt(diff.Duration.TotalHours / 24) & " days"
    ElseIf diff.Duration.TotalMinutes > 60 Then
        str = CInt(diff.Duration.TotalMinutes / 60) & " minutes"
    Else
        str = CInt(diff.Duration.TotalMinutes).ToString() & " minutes"
    End If
    If str.StartsWith("1") Then str = str.SubString(0, str.Length - 1)
    If diff.TotalDays > 0 Then
        str &= " ago"
    Else
        str &= " from now"
    End If
    Return str
End Function

إنها في الحقيقة ليست متطورة مثل تلك الموجودة بالفعل، ولكنها تعمل بشكل جيد على ما أعتقد.يمكن أن تكون طريقة تمديد لطيفة.

@ بيرتون:أعتقد أنه كان يقصد الاتجاه الآخر، على الأقل من المثال الموجود في الصفحة المرتبطة:

  Chronic.parse('tomorrow')
    #=> Mon Aug 28 12:00:00 PDT 2006

  Chronic.parse('monday', :context => :past)
    #=> Mon Aug 21 12:00:00 PDT 2006

  Chronic.parse('this tuesday 5:00')
    #=> Tue Aug 29 17:00:00 PDT 2006

اعتقدت أنني سأحاول ذلك أيضًا حتى أدركت!(على الرغم من التنفيذ الجميل)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top