-
יש לי משתנה שמחשב פער בין 2 תאריכים שפתחתי בתוך תנאי IF כך
if (AnHourOnCamera > datenow) { var Seconds1 = Seconds2 - Seconds2 * 2; Console.WriteLine(Seconds1); }
תכלס אני לא מצליח למצוא אותו בספריה וכאשר אני רושם אותו הוא מחזיר שגיאה שהוא לא קיים
ניסיתי להיעזר בזה
והוספתי את המשתנה לפני הIF אבל אז הוא החזיר לי שגיאה לגבי הערכים שהכנסתי.var Seconds1 = 0;
וזה השגיאהCannot implicitly convert type 'type' to 'type'
אשמח שיאירו את עיני איפה הטעות שלי..
-
@odeddvir
אם הבעיה היא המרה לא מפורשת, אז היא נשארה לא מפורשת. הצורה לפרש המרה היא רק ע"י קאסטינג: סוגריים עגולות לפני הביטוי שממירות מפורשות לטיפוס שתומך בהמרה הזו.
var מסיק את הסוג לפי המשך הביטוי, אני חושב שאין מצב ששינוי var לטיפוס תעזור.@אוריי הטיפוס Second2 הוא כנראה מסוג תאריך או TimeSpan ולכן כנראה לביטוי שלך אין משמעות. תעשה נקודה אחרי הSecond2 ובחר בSeconds או TotalSeconds ואז אתה מקבל את מספר השניות ולא את כל האובייקט שמייצג את הזמן הכולל.
(פעם הבאה אנא כלול בקוד את ההצהרה/יצירה של המשתנים הרלוונטים). -
@dovid
אני אסביר מפורשות יותר מה אני רוצה לעשות אולי כך יהיה יותר קל לכולם להבין איפה הבעיה שלי..
לדוגמא יש לי קבצים ממצלמה שצילמתי ולאחמ"כ התברר שהתאריך ושעה במצלמה לא היה מכוון מה שאני רוצה לעשות זה לכוון מחדש (כמובן שיש לי את התאריך הנוכחי של המצלמה שהוא כרגע אותו הפער לתאריך ושעה הנוכחיים)
כך שאם אני מוסיף את הפער לתאריך של הקובץ או מחסיר (במקרה שהתאריך במצלמה יותר גבוה מהתאריך הנוכחי) אני אמור לקבל את הזמן שבו צילמתי את התמונה מה שנשאר זה פשוט להחליף את התאריך שינוי בקובץ...
ולעניינו..
זה הקוד המלאusing System; using System.IO; namespace ChangeChangeDate { class Program { static void Main(string[] args) { DateTime AnHourOnCamera = new DateTime(2020, 7, 4, 0, 0,0); DateTime datenow = DateTime.Now; int Seconds2 = (int)datenow.Ticks - (int)AnHourOnCamera.Ticks; int Seconds1 = 0; if (Seconds2 < 0) { Seconds1 = Seconds2 - Seconds2 * 2; Console.WriteLine(Seconds1); } Console.WriteLine(Seconds2); string[] fileArray = Directory.GetFiles(Directory.GetCurrentDirectory() + @"\"); foreach (string item in fileArray) { if (item == Directory.GetCurrentDirectory() + @"\ChangeChangeDate.exe") { //ללא פעולה } else { DateTime lastModified = File.GetLastWriteTime(item); int updateDate = 0; if (Seconds2 < 0) { updateDate = (int)lastModified.Ticks - Seconds1; } else { updateDate = (int)lastModified.Ticks + Seconds2; } DateTime UD = new DateTime(updateDate); Console.WriteLine(UD); if (!File.Exists(item)) { File.Create(item); } else { Console.WriteLine($"{item}\n{lastModified}\n{updateDate}"); //File.SetLastWriteTime(item, new DateTime(ee.Year,ee.Month, ee.Day, ee.Hour,ee.Minute, ee.Second)); } } } } } }
אמנם מה ש @OdedDvir כתב עזר ברגע שעשיתי לו המרה מפורשת.
אבל משום מה הקוד לא עובד טוב בשורה 42
שמשום מה הוא מגיע למספר שלילי אע"פ ששני המספרים שהוא מקבל הם חיוביים וזה פעולת חיבור ...
אולי זה בגלל סוג המשתנה (כלומר אני צריך להשתמש במשתנה אחר?.. -
@אוריי נראה לי שאפשר לפשט את התהליך בהרבה:
using System; using System.IO; namespace ChangeChangeDate { class Program { static void Main(string[] args) { DateTime AnHourOnCamera = new DateTime(2020, 7, 4, 0, 0,0); DateTime datenow = DateTime.Now; // חישוב ההפרש בימים int daysDifference = (AnHourOnCamera - datenow).Days; // ..... // ..... // ..... DateTime lastModified = File.GetLastWriteTime(item); // חישוב התאריך הנכון על ידי הוספת ההפרש לתאריך הקיים DateTime correctDate = lastModified.AddDays (daysDifference); Console.WriteLine(correctDate); // וכו'..........
-
@אוריי סליחה על החריפות אבל אתה עושה דברים בלי להבין.
Ticks זה בכלל לא שניות. זה מספר מטיפוס Long שמייצג את מספר אלפיות השניה שעברו מתחילת התאריך הלועזי (01/01/001). זה מספר אדיר, ואם אתה שובר אותו לint אתה פשוט מאבד את המידע.
אתה לא צריך להמיר לint ובכלל לא צריך להתעסק עם הTicks וגם לא עם השניות.
לא אמור לעניין אותך שניות כי אמור לעניין אותך ההפרש בין התאריך שבצלמה לתאריך הנוכחי ואת ההפרש הזה להוסיף לכל תמונה ותמונה.בשביל לבנות כזה קוד, אתה כותב פיסת קוד נסיונית קטנה שמכילה רק את מה שרלוונטי:
var offset = DateTime.Now - new DateTime(2020, 7, 4, 8, 30, 0); var currFileDate = new DateTime(2020,6,24,15,42,0); var fixedDate = currFileDate + offset;
הoffset מכיל את הTimeSpan (שזה אובייקט של דוטנט שמכיל פרק-זמן בימים שעות שניות וכו')
שבין התאריך הנוכחי לתאריך של המצלמה (שים לב שכתבת 0 0 בשעה ובדקות, זה היה אולי לטסטים אבל בטוח שזה לא היה התאריך במצלמה באותו רגע. כמו"כ אתה צריך לעדכן את הקוד ממש לרגע ההרצה אם חשוב לך גם הדקה).
כשאני הרצתי הפרק זמן הזה היה 335 ימים וכמה שעות.
כעת אתה מוסיף את הפרק זמן הזה עם האופרטור של הפלוס לתאריך ושעה כל שהם, כלומר התאריך ושעה של תאריך יצירת הקובץ (למה תאריך שינוי? תאריך יצירה).אם הכל עובד בדוגמה (תמיד תתחיל מדוגמאות)
תעשה את זה על הקבצים. -
אני כתבתי לך את הקוד כדי להקל על השיעורי בית וללמד אותך עוד טיפ או שניים:
var offset = DateTime.Now - new DateTime(2020, 7, 4, 8, 30, 0); Console.WriteLine("Offset is: " + offset.ToString()); var fileArray = Directory.GetFiles(".", "*.jpg"); foreach (string item in fileArray) { var createdAt = File.GetCreationTime(item); var fixedCreatedAt = createdAt + offset; File.SetCreationTime(item, fixedCreatedAt); Console.WriteLine($"{item}\n{createdAt}\n{fixedCreatedAt}\n--------"); }
-
@dovid אמר בלא מצליח לגשת למשתנה בתוך תנאי #C:
לפי המציאות ולפי הפרטים החלטתי שאין מקום לבדיקה אם זה שלילי או חיובי גם לו זה היה דינמי.
בעריכה שלי התכוונתי שהקוד שלך מטפל גם במקרה שהוא שלילי. אם הוא שלילי אז מידע זה נמצא בתוך ה-TimeSpan וחיבור של מספר חיובי עם מספר שלילי מניב פעולת חיסור.
-
@dovid אמר בלא מצליח לגשת למשתנה בתוך תנאי #C:
0 זה באמת int ולא long.
הסיבה שאם כותבים long זה יעבוד כי תמיד אפשר להציב int בתוך long בהמרה מרומזת כי אין איבוד מידע.לא ברור לי אם אתה מתווכח על משהו אקדמי בלי שום השלכה מעשית? כי בכל מקרה ההצהרה ש:
אין מצב ששינוי var לטיפוס תעזור
לא נכונה.
טסט:
var i = 1; i += int.MaxValue; Console.WriteLine($"i = {i}"); long j = 1; j += int.MaxValue; Console.WriteLine($"j = {j}"); // Output: // i = -2147483648 // j = 2147483648
-
@dovid אמר בלא מצליח לגשת למשתנה בתוך תנאי #C:
@אוריי סליחה על החריפות אבל אתה עושה דברים בלי להבין.
לא נבהל מחריפות ... אם לא זה איך אני ילמד... ככל שעולה החריפות אני לומד יותר
אבל עד כמה שתחשוב שאני עושה דברים בלי להבין אבל אתה צריך להבין אותי שאני מגיע ממקום של vba ולכן אתה רואה את הקוד שלי מסורבל מידי אבל (לאט לאט אבל בטוח) אני משתפר בזה..@dovid אמר בלא מצליח לגשת למשתנה בתוך תנאי #C:
בשביל לבנות כזה קוד, אתה כותב פיסת קוד נסיונית קטנה שמכילה רק את מה שרלוונטי:
את האמת התחלתי גם מחתיכת קוד ניסיונית והכל עבד מעולה ומשם המשכתי. אך מה שקרה זה שבעת שהמרתי לint התחילו הצרות (מה שהתברר כטעות).
@dovid אמר בלא מצליח לגשת למשתנה בתוך תנאי #C:
אני כתבתי לך את הקוד כדי להקל על השיעורי בית וללמד אותך עוד טיפ או שניים:
אני מקווה שזה לא יהיה בגדר של לעזור לאפרוח לצאת מהביצה ...
אני בע"ה ישב טוב במוצא"ש להבין את הקוד לעומקו (אני לא מסכים לעצמי בשופו"א להעתיק סתם קוד בלי להבין יהיה כמה מסורבל שיהיה זה בשבילי קו אדום) -
@dovid
דבר אחד לא הבנתי בקוד זה השורה הזו@dovid אמר בלא מצליח לגשת למשתנה בתוך תנאי #C:
var fileArray = Directory.GetFiles(".", "*.jpg");
השאלה היא למה כתבת כך ומה ההבדל אם יש? (חוץ מהאורך של הקוד).
אני קודם כתבתי כך :var fileArray = Directory.GetFiles(Directory.GetCurrentDirectory() + @"\");
אני כתבתי כך כי אני לא יודע איזה סיומת תהיה לי בהסרטות או בתמונות.
וכרגע אני שם לב ששלך מחזיר (ממה שבדקתי עד עתה) את אותה התוצאה.
עריכה: עכשיו אני שם לב שלא קימפלתי נכון ולכן הוא החזיר את אותה התוצאה.. -
@אוריי התחביר של Directory.GetFiles הוא כזה:
Directory.GetFiles(<search_pattern>)
הנתיב
"."
פירושו התיקיה הנוכחית והוא זהה לתוצאה של:Directory.GetCurrentDirectory() + @"\"
הפרמטר השני שהוסיף @dovid הוא תבנית החיפוש, ויש הגיון לחפש רק בקובצי תמונה ולא לשנות את התאריך של קבצים אחרים שבמקרה קיימים בתיקיה.