我需要在vb.net中生成当前日期,该日期也是毫秒。其实我用的是:
Date.Now
但这会返回一个简单的日期为2015年12月28日16:53,我也想要毫秒级的东西:
28/12/2015 16:53:48640864
我尝试过:
Public Shared Function MillisecondsDate()
Return Date.Now.ToString("HH:mm:ss.fffffff")
End Function
但这会返回错误的结果:
16:53:56.9884043
我需要与MySql
兼容的格式才能获得准确的lastUpdated
字段。有什么想法吗?
答案 0 :(得分:4)
来自评论:my db field is a timestamp
和I fix temp using a varchar instead a datetime or timestamp
TimeStamp
列与DateTime
列完全相同。根据{{3}}:
MySQL将TIMESTAMP值从当前时区转换为UTC进行存储,然后从UTC转换回当前时区进行检索。 (对于其他类型,例如DATETIME,不会出现这种情况。)
这是你可能永远看不到的东西,即使 MySQL WorkBench UI也会将其转换回来。
Documentation的问题是另一回事。将列定义为DateTime
或TimeStamp
时,默认情况下会删除小数秒,以便与旧版本兼容。
您可以定义任一类型以保留小数秒,而不是将任何类型的Date
列定义为字符串/ text / varchar - 当然还要将其解析回来 - 您可以定义任一类型以保留小数秒。在MySQL 5.6.4+中,您可以使用:DATETIME(n)
或TIMESTAMP(n)
(是的,那些为什么parens在UI下拉列表中显示)。其中n
是要存储的小数位数(0-6)。对于.NET,3
等于毫秒。之后,WorkBench UI也会显示毫秒:
DateTime(0)
(无分数)TimeStamp(3)
TimeStamp(6)
LastUpdated
列似乎最好由数据库管理,因此您不必通过代码执行此操作 - 或忘记这样做!使用默认值和Before_Update
触发器非常简单:
TIMESTAMP(3)
CURRENT_TIMESTAMP(3)
作为默认值ADD COLUMN
LastUpdated
TIMESTAMP(3)NOT NULL DEFAULT CURRENT_TIMESTAMP(3)COMMENT'';
这将自动设置添加到当前时间(UTC等)的新项目的LastUpdated
值,以毫秒为单位(TIMESTAMP(6)
可能更好,但问题只是烦恼有关ms)。请务必在默认值中指定相同的位数。
然后,在更新每条记录时,不要手动传递DateTime.Now
(或转换为字符串),而是添加一个触发器来为您更新列。在MySql Workbench中:
CREATE DEFINER=`root`@`localhost` TRIGGER `test`.`demo_BEFORE_INSERT` BEFORE INSERT ON `demo` FOR EACH ROW
BEGIN
SET new.LastUpdated := now(3);
END
其中大部分是UI工具创建的样板。您只需输入:
SET new.LastUpdated := now(3);
对于这种类型的列,您可以在BEFORE_INSERT
触发器上添加相同的内容来代替默认值。在 MySQL WorkBench 中,在查看表定义时单击“触发器”选项卡 - 只需添加SET语句。
测试代码
这显示了从代码到db并返回的小数毫秒,并显示触发器有效(使用上面显示的表):
Dim Usql = "UPDATE Demo SET Foo = @p1 WHERE Id=5"
Dim Ssql = "SELECT Name, StartDate, Foo, LastUpdated FROM Demo WHERE Id=5"
Dim dtVar As DateTime = DateTime.Now
Console.WriteLine("DT ms in code var: {0}", dtVar.Millisecond)
Using dbcon = GetMySQLConnection()
dbcon.Open()
Using cmd As New MySqlCommand(Usql, dbcon)
cmd.Parameters.AddWithValue("@p1", dtVar)
cmd.ExecuteNonQuery()
End Using
Using cmd As New MySqlCommand(Ssql, dbcon)
Using rdr As MySqlDataReader = cmd.ExecuteReader
If rdr.HasRows Then
rdr.Read()
Dim tempDT = rdr.GetMySqlDateTime(1) ' DateTime(0)
Console.WriteLine("DT.MS from DB {0}", tempDT.Millisecond)
Dim mydt = rdr.GetMySqlDateTime(2) ' TimeStamp(6)
Console.WriteLine("Micro from DB {0} ", mydt.Microsecond)
' either get method retains the ms TimeStamp(3)
Dim lstupD = Convert.ToDateTime(rdr("lastUpdated"))
Console.WriteLine("MS from trigger {0}", lstupD.Millisecond)
End If
End Using
End Using
End Using
结果:
代码var:615中的DT ms 来自DB 0的DT.MS 来自DB 615413的Micro MS来自触发器615
定义为存储小数秒的列这样做的时间是微秒(滴答)。请注意,Update SQL不引用LastUpdated
列,但它会在触发器的帮助下更新。如果您正在进行步骤调试并使用上述变量,则触发时间可能与其他时间不同,因为您在单步执行时会过去。
答案 1 :(得分:0)
试试这个
Public Shared Function MillisecondsDate()
Return Date.Now.ToString("dd/MM/yyyy HH:mm:ss.fff")
End Function
答案 2 :(得分:-1)
尝试此功能:


 公共共享功能MillisecondsDate()
返回DateTime.UtcNow.ToString(“dd / MM / yyyy HH:mm:ss.fff”)
结束函数